Spring MVC和JSR-303 hibernate条件验证

mic*_*son 9 java validation spring spring-mvc bean-validation

我有一个我要验证的表单.它包含2个地址变量.始终要验证address1,必须根据某些条件验证address2

public class MyForm {
    String name;
    @Valid Address address1;
    Address address2;
 }

public class Address {
    @NotEmpty   
    private String street;
}
Run Code Online (Sandbox Code Playgroud)

我的控制器自动验证并绑定我的表单obj

@RequestMapping(...)
public ModelAndView edit(
        @ModelAttribute("form")
        @Valid
        MyForm form,
        BindingResult bindingResult,
        ...)

        if(someCondition) {
            VALIDATE form.address2 USING JSR 303
Run Code Online (Sandbox Code Playgroud)

问题是,如果我使用LocalValidatorFactoryBean验证器,我无法重用Spring提供的BinidingResult对象.绑定不起作用,因为'result'的目标对象是'MyForm'而不是'Address'

validate(form.getAddress2(), bindingResult)   //won't work
Run Code Online (Sandbox Code Playgroud)

我想知道什么是标准/清洁方法来进行条件验证.

我正在考虑以编程方式在我的控制器中创建一个新的BindingResult.

final BindingResult bindingResultAddress2 = new BeanPropertyBindingResult(address2, "form");
validate(form.getAddress2(), bindingResultAddress2);
Run Code Online (Sandbox Code Playgroud)

但是我从bindingResultAddress2获得的错误列表无法添加到一般的'bindingResult',因为字段名称不正确('street'而不是'address2.street'),绑定将不起作用.

一些肮脏的方法是扩展BeanPropertyBindingResult以接受一些字符串附加到字段名称..你有更好的方法吗?

axt*_*avt 5

验证层次结构的标准方法是使用pushNestedPath()/ popNestedPath(),虽然我不确定它如何与JSR-303一起使用:

bindingResult.pushNestedPath("address2");
validate(form.getAddress2(), bindingResult);
bindingResult.popNestedPath();
Run Code Online (Sandbox Code Playgroud)

  • "@ Valid"中的群组有功能请求:https://jira.springframework.org/browse/SPR-6373 (3认同)