JSR 303为cascade @valid设置自定义验证器

时间:2012-07-10 15:34:55

标签: spring hibernate bean-validation customvalidator

我想验证包含在另一个表单对象中的表单对象。我有这样的事情:

@Controller
public class FormController {
    @RequestMapping(method = RequestMethod.POST)
    public void process(@ModelAttribute("form") @Valid FormObject formObject, 
                              BindingResult result) {
            ...
        @InitBinder("form")
        protected void initBinder(WebDataBinder binder) {
             binder.setValidator(customFormValidator);
        }
    }

public class FormObject {
    @Valid
    private FormObject2 formObject2;
}

// This is the class that needs to be validated.
public class FormObject2 {
    @NotEmpty
    private String name;
}
}

我遇到的问题是我希望对象formObject2由另一个自定义验证器验证(例如“customFormValidator2”),但我找不到如何注册它。如果我这样说,弹簧验证器将验证第二种形式。

我已经尝试在customFormValidator中验证第二种形式,但是第二种形式的错误路径与第一种形式无关,我无法在jsp页面中显示错误。

我已经像这样构建了我的表单对象,因为我可能需要在其他表单中使用第二个表单,并且通过这样做我使其更加模块化。

我有可能做的事吗?你有更好的建议吗?

1 个答案:

答案 0 :(得分:0)

您可以使用自定义验证程序验证form Object2,如

 public void process(@ModelAttribute("form") @Valid FormObject formObject, 
                              BindingResult result) {
customFormValidator2.validate(formObject.getFormObject2(), result);  
}  

删除@Valid以删除JSR验证

public class FormObject {
 //   @Valid REMOVE THIS
     private FormObject2 formObject2;
}

此外,您可以将路径属性用于嵌套类,例如

<form:input path="formObject2.any_property_name">  

您也可以毫无问题地使用相同的路径进行错误 有关详细信息,请查看此link