2

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

我有一个表单,我希望用户能够从复选框列表(由枚举支持)中选择多个项目,并将其作为 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 个错误字段“days”上的对象“filterForm”中的字段错误:拒绝值 [0,1];代码 [typeMismatch.filterForm.days,typeMismatch.days,typeMismatch.java.util.EnumSet,typeMismatch]; 参数 [org.springframework.context.support.DefaultMessageSourceResolvable: 代码 [filterForm.days,days]; 论据 []; 默认消息 [天]];默认消息 [无法将类型“java.lang.String[]”的属性值转换为属性“days”所需的类型“java.util.EnumSet”;嵌套异常是 org.springframework.core.convert.ConversionFailedException: 无法从 java.lang.String[] 类型转换为值 '{0, 1}' 的 java.util.EnumSet 类型;嵌套异常是 java.lang。

知道问题是什么,或者是否有更好的方法来实现这一目标?谢谢

4

2 回答 2

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;
    }
}
于 2013-10-02T11:05:58.390 回答
0

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

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

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

filterForm.setDays(EnumSet.allOf(Day.class));
于 2015-04-07T15:13:15.900 回答