如何使用Spring Validator验证多个POJO?

时间:2018-09-13 17:53:40

标签: hibernate spring-mvc spring-validator

我有一个单一的表格,其中有三个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 似乎与其他两个重叠,并带有错误消息。

2 个答案:

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

现在可以轻松验证单个包装器类。