7

既存のデータベース行を編集するためのフォームを作成しようとしています。Spring MVCフォームタグを使用して、HTMLをフォームバッキングオブジェクトに自動バインドしています。行には別のテーブルとの多対多の関係があり、form:selectタグを使用して複数の選択ボックスで表現しようとしています。

<form:select path="rules">
    <form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/>
</form:select>

私は永続性のためにHibernateを使用しているので、関係はバンドルpojo内のHashSetとして表されます。

 private Set<Rule> rules = new HashSet<Rule>(0);

ページに選択ボックスがないと、オブジェクトはデータベースに正しく更新されますが、選択ボックスを使用すると、オブジェクトはデータベースに更新されず、log4jログにこのエラーが表示されます。このエラーが例外を引き起こしていないことに注意してください。 、ログにのみ表示されます。

DEBUG org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:256) - Data binding errors: 1

これは、選択ボックス内のアイテムの選択を解除しても、フォーム全体が正しく送信されない場合に発生します。誰か助けてもらえますか?

コレクション属性をSpringMVCのフォームにバインドする方法を知っています。これはこの質問に似ていますが、残念ながら、どの提案も私の問題に役立つとは思えませんでした。

4

1 に答える 1

8

問題は、フォームの送信にあります。Spring はコマンドのオブジェクトをバインドできないため、フォームは送信されませんが、代わりに formView にリダイレクトされます。

バインドが正常に実行されると、代わりに次のメッセージが表示されます。

No errors -> processing submit

問題を解決するには、コントローラーに CustomCollectionEditor を登録する必要があります。(このリンクを参照してください)。次のようになります。

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception
{   
  binder.registerCustomEditor(Set.class, "rules", new CustomCollectionEditor(Set.class)
  {
    protected Object convertElement(Object element)
    {
        String name = "";

        if (element instanceof String)
            name = (String) element;

        return name != null ? new Rule(name) : null;
    }
  });
}
于 2009-04-07T07:44:26.993 に答える