I have a html form input that submits a string value that needs to be
converted to a java Collection (a Set object in this case). Specifically
the input key/value is: viewTasksFilter.taskStatuses="[OPEN,COMPLETE]".
In the "viewTaskFilter" object, "taskStatuses" is defined as a Set with
enum values (Set<TaskStatus> taskStatuses). The custom converter below
does convert the input form value to a Set, however it is a Set<String>
(not Set<TaskStatus>). This is an issue because the Struts Action member
variable "viewTasksFilter.taskStatuses" now contains a Set of the wrong
type. Since I will have other variables that need this logic, I would
prefer not to hardcode the Set<TaskStatus> in this converter. Is there a
way to use existing Struts "converter code" to convert the Set<String> to
the appropriate Set<Object>? I know the built-in Struts converters already
do this, but I am unable to figure out how to do this in a custom
converter. Is this possible? Or is this even the right way to solve this
issue? Any help is appreciated!
/**
* Converter class to convert comma separated string to a collection
*/
public class MyStringToCollectionConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class
toClass) {
String s = values[0];
String temp = s.replaceAll("[\\[\\]\"']", "");
List<String> cleanedValues = Arrays.stream(temp.split(","))
.map(String::trim)
.collect(Collectors.toList());
if (toClass == Set.class) {
try {
if (cleanedValues.size() == 0) {
return null;
} else {
return new HashSet<>(cleanedValues);
}
} catch (Exception e) {
throw new TypeConversionException("Could not parse to Set
class:" + Arrays.toString(values));
}
} else if (toClass == List.class) {
try {
if (cleanedValues.size() == 0) {
return null;
} else {
return cleanedValues;
}
} catch (Exception e) {
throw new TypeConversionException("Could not parse to List
class:" + Arrays.toString(values));
}
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
if (o == null) {
return null;
} else {
return o.toString();
}
}
}