2011-09-06 9 views
7

私はJavaとSpringをWebアプリケーション用に使用しています。バインディングスプリング:送信時にenumsetするチェックボックスでエラーが発生する

私は属性としてEnumInnerObject型のEnumSet(enumSet)を含むオブジェクト(objectBean)を持っています。このオブジェクトを私のコントローラから.jspビューにBeanとして渡しています。私は、チェックボックスをバインドするために、次の.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を通過し、これがすべて含まれていEnumInnerObjectオプションを使用すると、すべてのチェックボックスが表示されます。 "enumSet"は適切な値を含むEnumSet属性です(値がEnumSetに含まれている場合、 "allOptions"の正しいボックスが自動的にチェックされます)。これはすべて動作し、.jspは正しいチェックボックスを正しく表示します。しかし、問題は私が保存するページを提出するときです。私は、フォームは仕事に提出得るためにInitBinderを変更する必要が感じている

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] 

:私は次のエラーを取得します。何か案は??

ありがとうございます!

答えて

5

この考えがどのように働くのか想像がつきません:EnumSetコレクションは列挙型の値を格納するように設計されていますが、その列挙型の要素の数を知る必要がありますそれはその言葉の宇宙です)。

CustomCollectionEditorは、コンストラクタ引数としてコレクションクラスに渡されるため、このコレクションを作成する必要があり、上記の理由で失敗します。 CustomCollectionEditor以上は、限られた量のターゲットコレクションのみをサポートします(ArrayListTreeSetLinkedHashSetCustomCollectionEditor#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); 
     } 
    }); 
関連する問題