Spring Form:根据params选择bean

时间:2015-06-01 14:27:24

标签: java forms validation spring-mvc modelattribute

我有一个关于春天形式的问题(有了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)。 ..而且我认为这不是一个好的解决方案,嗯 希望我的问题听起来并不愚蠢^^

提前感谢您的时间和精力。

1 个答案:

答案 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
}