Java 绑定spring:在提交时将复选框设置为enumset会导致错误

Java 绑定spring:在提交时将复选框设置为enumset会导致错误,java,spring,model-view-controller,jstl,Java,Spring,Model View Controller,Jstl,请注意,我正在使用Java和Spring开发一个web应用程序 我有一个对象(objectBean),它包含一个EnumInnerObject类型的EnumSet(EnumSet)作为属性。我将此对象作为bean从控制器传递到.jsp视图。我使用以下.jsp代码绑定复选框: <form:form commandName="objectBean" name="whatever" action="./save.htm" method="post"> <form:checkb

请注意,我正在使用Java和Spring开发一个web应用程序

我有一个对象(objectBean),它包含一个EnumInnerObject类型的EnumSet(EnumSet)作为属性。我将此对象作为bean从控制器传递到.jsp视图。我使用以下.jsp代码绑定复选框:

<form:form commandName="objectBean" name="whatever" action="./save.htm" method="post">
    <form:checkboxes items="${allOptions}" path="enumSet" />
</form:form>
在控制器中,我传递allOptions(与我的bean分离),其中包含所有EnumInnerObject选项,因此显示所有复选框。“enumSet”是包含适当值的enumSet属性(如果该值包含在enumSet中,则它会自动选中“allOptions”中的正确框)。所有这些都有效,并且.jsp正确地显示了正确的复选框。但是,问题是当我提交要保存的页面时。我得到以下错误:

java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String[]] to required type [java.util.EnumSet] for property 'enumSet': PropertyEditor [com.example.controller.MyController$1] returned inappropriate value]
我有一种感觉,我必须修改InitBinder以使表单提交工作。有什么想法吗


谢谢

坦率地说,我很难想象这个想法会如何运作:
EnumSet
集合设计用于存储枚举的值,但在构建它的那一刻,它需要知道枚举中元素的数量(=宇宙的大小,它的术语)

CustomCollectionEditor
被传递一个集合类作为其构造函数参数,因此它需要创建此集合,并且由于上述原因它将失败。更多信息
CustomCollectionEditor
仅支持有限数量的目标集合(
ArrayList
TreeSet
LinkedHashSet
,请参阅)

为了避免事情过于复杂,我建议您使用公共集合,而不是
EnumSet
。否则,您需要编写自己的属性编辑器。实施不会很困难,比如:

binder.registerCustomEditor(EnumSet.class, "enumSet",
    new PropertyEditorSupport() {
        @Override
        public void setValue(Object value) {
            EnumSet<EnumInnerObject> set = EnumSet.noneOf(EnumInnerObject.class);

            for (String val: (String[]) value) {
                set.add(EnumInnerObject.valueOf(val));
            }

            super.setValue(set);
        }
    });
binder.registerCustomEditor(EnumSet.class,“EnumSet”,
新属性编辑支持(){
@凌驾
公共无效设置值(对象值){
EnumSet set=EnumSet.noneOf(EnumInnerObject.class);
for(字符串val:(字符串[])值){
set.add(enuminerObject.valueOf(val));
}
super.setValue(set);
}
});
binder.registerCustomEditor(EnumSet.class, "enumSet",
    new PropertyEditorSupport() {
        @Override
        public void setValue(Object value) {
            EnumSet<EnumInnerObject> set = EnumSet.noneOf(EnumInnerObject.class);

            for (String val: (String[]) value) {
                set.add(EnumInnerObject.valueOf(val));
            }

            super.setValue(set);
        }
    });