在我的Spring 3.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;
}
// ...
}
我的第一个想法是使用表单工厂,但在这种情况下我无法实现。
如何将(或引用)注入predefinedLocations
bean到我的表单中?
答案 0 :(得分:2)
我终于找到了解决方案。
现在,我的控制器中的表单如下所示:
@ModelAttribute("creationForm")
private CreationForm getCreationForm() {
return new CreationForm(predefinedLocations);
}
这样,@Valid
不会实例化新表单,而是重用前一个实例。