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(); } } }