Spring MVC和JSR-303休眠条件验证


问题内容

我有一个要验证的表格。它包含2个地址变量。地址1必须始终经过验证,地址2必须根据某些条件进行验证

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

public class Address {
    @NotEmpty   
    private String street;
}

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

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

        if(someCondition) {
            VALIDATE form.address2 USING JSR 303

问题是,如果我使用LocalValidatorFactoryBean验证程序,我将无法重用Spring提供的BinidingResult对象。绑定将不起作用,因为“结果”的目标对象是“
MyForm”而不是“地址”

validate(form.getAddress2(), bindingResult)   //won't work

我想知道进行条件验证的标准/干净方法是什么。

我在考虑以编程方式在控制器中创建新的BindingResult。

final BindingResult bindingResultAddress2 = new BeanPropertyBindingResult(address2, "form");
validate(form.getAddress2(), bindingResultAddress2);

但是由于字段名不正确(“ street”而不是“
address2.street”),因此我无法从bindingResultAddress2获取的错误列表添加到常规的“
bindingResult”中,并且绑定无法正常工作。

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


问题答案:

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

bindingResult.pushNestedPath("address2");
validate(form.getAddress2(), bindingResult);
bindingResult.popNestedPath();