【问题标题】:Receive an EnumSet from a spring form checkbox element?从弹簧表单复选框元素接收 EnumSet?
【发布时间】:2013-10-08 16:49:30
【问题描述】:

我已经看到了一些关于这个主题的相关问题,但似乎没有一个与我所追求的完全匹配。

我有一个表单,我希望用户能够从复选框列表(由枚举支持)中选择多个项目,并将其作为 Set 接收。我有以下(以天为例)

我的枚举:

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 个错误 字段“天”上的对象“filterForm”中的字段错误:拒绝值 [0,1];代码 [typeMismatch.filterForm.days,typeMismatch.days,typeMismatch.java.util.EnumSet,typeMismatch]; 论据 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [filterForm.days,days];论据 [];默认消息 [天]]; 默认消息[无法转换类型的属性值 'java.lang.String[]' 为属性所需的类型'java.util.EnumSet' '天';嵌套异常是 org.springframework.core.convert.ConversionFailedException: 失败 从 type java.lang.String[] 转换为 type java.util.EnumSet 用于值“{0, 1}”; 嵌套异常是 java.lang.IllegalArgumentException: 不能 实例化集合类型:java.util.EnumSet] org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:111) org.springframework.web.method.support.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.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) org.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.doDispatch(DispatcherServlet.java:923) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

知道问题出在哪里,或者是否有更好的方法来解决这个问题? 谢谢

【问题讨论】:

    标签: java forms spring-mvc enums enumset


    【解决方案1】:

    我设法通过将表单更改为使用 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您只需要使用接口而不是实现。

      您仍然可以使用 EnumSet,但声明需要使用接口(无论如何这是一个好习惯)。

      也就是说,使用Abby's answer提供的代码。然后,您可以执行以下操作:

      filterForm.setDays(EnumSet.allOf(Day.class));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 2023-04-07
        相关资源
        最近更新 更多