我有一个关于春天形式的问题(有了Thymeleaf,具体而言)
我知道我一次只能使用一个bean来支持Spring中的表单,所以我认为让Controller选择哪个bean应该绑定到表单会很好,这取决于发送的参数。但是我没有为每个新的参数编写新的RequestMapping,而是想知道我是否能以某种方式将参数仅映射到ModelAttribute
本身。
我想到了这样的事情:
@Controller
public class FormController{
@ModelAttribute("bean", params={"type=bean1"}) //this declaration is invalid
public IBean loadEmptyModelBean(){
return new Bean1();
}
@ModelAttribute("bean", params={"type=bean2"})
public IBean loadEmptyModelBean(){
return new Bean2();
}
//..
@RequestMapping(method=RequestMethod.GET)
public String showForm(IBean bean){
//..
}
@RequestMapping(method=RequestMethod.POST, params={"validate"})
public String validate(@Valid IBean bean, BindingResult result){
List<ObjectError> errors = bean.validate();
for(ObjectError e: errors){
result.addError(e);
}
//redirecting, etc
}
}
正如您所看到的,我将根据参数实例化不同的Bean,并且仍然只为每个GET和POST过程使用一个方法,因为IBean将是一个强制所有Bean实现validate()方法的接口。
我几天前刚开始使用Spring,并且想知道是否有人知道解决方案,谁比我更有经验:) 我搜索了一个答案,但无法找到解决我具体问题的方法。我想,我可以实现很多处理程序,这些处理程序由params过滤,但这将是非常多余的,因为每个方法都必须这样做(调用validate() - 方法并将新错误添加到BindingResult)。 ..而且我认为这不是一个好的解决方案,嗯 希望我的问题听起来并不愚蠢^^
提前感谢您的时间和精力。
答案 0 :(得分:0)
Spring的方法是让不同的@RequestMapping
带注释的方法调用完成工作的私有方法:
@RequestMapping(method=RequestMethod.POST, params={"validate", "type=bean1"})
public String validate1(@Valid Bean1 bean, BindingResult result){
return doValidate(bean, result);
}
@RequestMapping(method=RequestMethod.POST, params={"validate", "type=bean2"})
public String validate2(@Valid Bean2 bean, BindingResult result){
return doValidate(bean, result);
}
private String doValidate(IBean bean, BindingResult result){
List<ObjectError> errors = bean.validate();
for(ObjectError e: errors){
result.addError(e);
}
//redirecting, etc
}