Получите EnumSet от элемента флажка пружинной формы?

Я видел несколько похожих вопросов по этой теме, но ни один из них, похоже, не соответствует тому, что я ищу.

У меня есть форма, в которой я хотел бы, чтобы пользователь мог выбрать несколько элементов из списка флажков (подкрепленных перечислением) и получить их в виде набора. У меня есть следующее (используя дни в качестве примера)

Мое перечисление:

public enum Day {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}

Отправка значений перечисления на страницу в контроллере для отображения в качестве параметров:

model.addAttribute("allDays", Day.values());

Запись параметров в виде флажков и сопоставление правильного поля формы:

<form:form method="get" modelAttribute="filterForm" commandName="filterForm">
    <c:forEach items="${allDays}" var="item">
        <form:checkbox path="days" value="${item.name()}" label="${item.name()}"/>
    </c:forEach>
</form:form>

Объект формы, поддерживающий форму:

public class FilterForm {

    private EnumSet<Day> days;

    public EnumSet<Day> getDays() {
        return days;
    }

    public void setDays(EnumSet<Day> days) {
        this.days = days;
    }
}

Это работает, поскольку показывает параметры правильно, но когда я пытаюсь отправить, я получаю сообщение об ошибке:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 error Ошибка поля в объекте 'filterForm' в поле 'days': отклоненное значение [0,1]; коды [typeMismatch.filterForm.days,typeMismatch.days,typeMismatch.java.util.EnumSet,typeMismatch]; аргументы [org.springframework.context.support.DefaultMessageSourceResolvable: codes [filterForm.days,days]; аргументы []; сообщение по умолчанию [дни]]; сообщение по умолчанию [Не удалось преобразовать значение свойства типа 'java.lang.String[]' в требуемый тип 'java.util.EnumSet' для свойства 'days'; вложенным исключением является org.springframework.core.convert.ConversionFailedException: не удалось преобразовать тип java.lang.String [] в тип java.util.EnumSet для значения '{0, 1}'; Вложенное исключение - java.lang.IllegalArgumentException: не удалось создать экземпляр Тип коллекции: java.util.EnumSet] org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMorthodefwebdws_service).HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75) org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues ​​(InvocableHandlerMethod.java:156) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) org.springframework.web.servlet.mvc.metHeg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) org.springframework.web.servlet. javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

Любая идея, в чем проблема или есть ли лучший способ добиться этого? Спасибо

2 ответа

Решение

Мне удалось решить эту проблему, изменив форму для использования Set вместо EnumSet, и я также изменил тег так, чтобы отправленные значения оставались выделенными:

<form:form method="get" modelAttribute="filterForm" commandName="filterForm">
    <form:checkboxes items="${allDays}" path="days" />
</form:form>

И Форма:

public class FilterForm {

    private Set<Day> days;

    public Set<Day> getDays() {
        return days;
    }

    public void setDays(Set<Day> days) {
        this.days = days;
    }
}

Вам просто нужно работать с интерфейсами вместо реализаций.

Вы все еще можете использовать EnumSet, но декларация должна использовать интерфейсы (в любом случае, это хорошая практика).

Другими словами, используйте код, предоставленный ответом Эбби. Затем вы можете делать такие вещи, как:

filterForm.setDays(EnumSet.allOf(Day.class));
Другие вопросы по тегам