【问题标题】:Binding spring:checkboxes to enumset on submit causes error在提交时绑定 spring:checkboxes 到 enumset 会导致错误
【发布时间】:2011-11-11 14:15:49
【问题描述】:

请注意,我正在将 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>

这是我的控制器 initbinder:

@InitBinder
protected void initBinder(WebDataBinder binder) throws Exception{
    binder.registerCustomEditor(EnumSet.class, "enumSet", new CustomCollectionEditor(Collection.class){
        protected Object convertElement(Object element){
            if(element instanceof String){
                EnumInnerObject enumInnerObject= EnumInnerObject.valueOf((String)element);
                return enumInnerObject;
            }
             return null;
         }
     });

在控制器中,我传递了 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 才能让表单提交工作。有什么想法吗??

谢谢!

【问题讨论】:

    标签: java spring model-view-controller jstl


    【解决方案1】:

    坦率地说,我很难想象这个想法会如何工作:EnumSet 集合旨在存储枚举的值,但在构造它的那一刻需要知道该枚举中的元素数量(=宇宙的大小,它的条款)。

    CustomCollectionEditor 传递了一个集合类作为它的构造函数参数,所以它需要创建这个集合,它会因为上述原因而失败。更多CustomCollectionEditor 仅支持有限数量的目标集合(ArrayListTreeSetLinkedHashSet,请参阅CustomCollectionEditor#createCollection())。

    为了不让事情变得过于复杂,我建议你使用通用集合,而不是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);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2014-12-02
      • 2021-05-04
      • 2020-12-01
      • 1970-01-01
      • 2011-03-19
      相关资源
      最近更新 更多