Spring 形式:select bean 根据参数
Spring Form: select bean according to params
我有一个关于 Spring 表格的问题(具体来说是 Thymeleaf)。
我知道我一次只能使用一个 bean 来支持 Spring 中的表单,所以我认为让控制器 select 哪个 bean 应该绑定到表单会很好,具体取决于发送哪些参数。但是我想知道我是否可以以某种方式将参数仅映射到 ModelAttribute
本身,而不是为每个新参数编写一个新的 RequestMapping。
我想到了这样的事情:
@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 将是一个接口,它强制所有 Beans 实现一个验证()方法。
我几天前才开始使用 Spring,想知道是否有人知道解决这个问题的方法,谁比我更有经验:)
我搜索了答案,但找不到解决我的特定问题的方法。我想,我可以实现很多处理程序,它们由参数过滤,但那将是非常多余的,因为每个方法都必须做同样的事情(调用 validate() 方法并将新错误添加到 BindingResult)。 ..我认为这不是一个好的解决方案,待定。
希望我的问题听起来不傻^^
提前感谢您的时间和精力。
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
}
我有一个关于 Spring 表格的问题(具体来说是 Thymeleaf)。
我知道我一次只能使用一个 bean 来支持 Spring 中的表单,所以我认为让控制器 select 哪个 bean 应该绑定到表单会很好,具体取决于发送哪些参数。但是我想知道我是否可以以某种方式将参数仅映射到 ModelAttribute
本身,而不是为每个新参数编写一个新的 RequestMapping。
我想到了这样的事情:
@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 将是一个接口,它强制所有 Beans 实现一个验证()方法。
我几天前才开始使用 Spring,想知道是否有人知道解决这个问题的方法,谁比我更有经验:)
我搜索了答案,但找不到解决我的特定问题的方法。我想,我可以实现很多处理程序,它们由参数过滤,但那将是非常多余的,因为每个方法都必须做同样的事情(调用 validate() 方法并将新错误添加到 BindingResult)。 ..我认为这不是一个好的解决方案,待定。
希望我的问题听起来不傻^^
提前感谢您的时间和精力。
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
}