我有一个单一的表格,其中有三个Pojo,因为每个Pojo都有三个单独的表。表单中的两个字段已预先填充。现在,我想使用spring验证器来验证表单。我试图在抽象类中使用所有三个Pojo的公共字段,并且每个Pojo都对其进行扩展,但是spring无法为抽象类创建Object并引发异常。我宁愿不使用Interface,因为我必须初始化所有字段。
下面是参考代码。
控制器
@RequestMapping(value="/save",method=RequestMethod.POST)
public String saveData(@ModelAttribute("commonForm")@Valid Foo foo,FooBar fooBar,Test test,BindingResult result){
this.testValidator.validate(foo, result); //which Pojo to provide here
if(result.hasErrors()){
return "redirect:/regPage";
}else{
return "success";
}
}
Validator
public class TestValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return Foo.class.equals(clazz)|| FooBar.class.equals(clazz)|| Test.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
if(target instanceof Foo){
//validate Foo...
}else if(target instanceof FooBar){
//validate FooBar...
}else{
//validate Test...
}
}
}
最后一个Pojo,即 test 似乎与其他两个重叠,并带有错误消息。
答案 0 :(得分:0)
在您的控制器中,您需要通过绑定器初始化验证器。
@InitBinder
public void InitBinder(WebdataBinder binder){
binder.addValidators(new TestValidator())
}
还必须将BindingResult放在要验证的模型之后。
“ Errors或BindingResult参数必须跟随立即绑定的模型对象,因为方法签名可能不止一个模型对象,Spring会创建一个单独的BindingResult”-从Spring docs
所以您的情况应该如此。
@RequestMapping(value="/save",method=RequestMethod.POST)
public String saveData(@ModelAttribute("commonForm")@Valid Foo foo, BindingResult resultFoo, @Valid FooBar fooBar, BindingResult resultFooBar, @Valid Test test, BindingResult resultTest){
if(resultFoo.hasErrors() || resultFooBar.hasErrors() || resultTest.hasErrors()){
return "redirect:/regPage";
}else{
return "success";
}
}
答案 1 :(得分:0)
在 apply custom validator in spring MVC controller in more than one class 如果这样做没有帮助,您可以使用以下答案。
在Spring MVC中,让模型/ PoJo进行验证不是一个好主意,我建议创建一个包含两个类的包装器类,并像单个类一样对其进行验证。
想象一下您有
class MyClass1 {
// codes
}
class MyClass2 {
// codes
}
您应该创建:
class WrapperClass {
private Class1 class1;
private Class2 class2;
// getter & setters
}
现在可以轻松验证单个包装器类。