-4

私のSpring3.1.2.RELEASEアプリケーションには、事前定義されたBeanの注入を必要とする複雑なフォームがあります。

<util:map id="predefinedLocations" map-class="java.util.LinkedHashMap">
    <entry key="first address" value="Location A" />
    <entry key="another one" value="Location B" />
    <!-- ... -->
</util:map>

私のフォームは次のように作成されます。

@RequestMapping(value = "/create", method = RequestMethod.GET)
public CreationForm createForm() {
    return new CreationForm();
}

@Validコントローラーがフォームをインスタンス化しようとするアノテーションを使用しているため、フォームのコンストラクター引数としてマップを渡すことができません。

@RequestMapping(value = "/create", method = RequestMethod.POST)
public String create(@Valid CreationForm form, BindingResult formBinding, Model model) {
    if (formBinding.hasErrors()) {
        // PROBLEM HERE
        //
        // View rendering fails because a freshly created CreationForm will be
        // passed to the view so Spring needs to handle the injection of
        // predefinedLocations.
        return null;
    }
    // ...
}

私の最初のアイデアはフォームファクトリを使用することでしたが、このコンテキストではそれを実現できません。

Beanをフォームに注入(または参照)するにはどうすればよいですか?predefinedLocations

4

1 に答える 1

2

私は最終的に解決策を見つけました。

フォームは、コントローラーで以下のように作成されます。

@ModelAttribute("creationForm")
private CreationForm getCreationForm() {
    return new CreationForm(predefinedLocations);
}

このように@Valid、新しいフォームをインスタンス化するのではなく、以前のインスタンスを再利用します。

于 2012-07-31T09:31:03.437 に答える