Spring MVC and JSR-303 hibernate conditional validation

bean-validation, java, spring, spring-mvc, validation

Solution

The standard approach for validating hierarchical structures is to use `pushNestedPath()`/`popNestedPath()`, though I'm not sure how it plays with JSR-303:

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

Problem

I've a form I want to validate. It contains 2 Address variables. address1 has always to be validated, address2 has to be validated based on some conditions ``` public class MyForm { String name; @Valid Address address1; Address address2; } public class Address { @NotEmpty private String street; } ``` my controller automatically validates and binds my form obj ``` @RequestMapping(...) public ModelAndView edit( @ModelAttribute("form") @Valid MyForm form, BindingResult bindingResult, ...) if(someCondition) { VALIDATE form.address2 USING JSR 303 ``` the problem is that if I use the LocalValidatorFactoryBean validator i can't reuse the BinidingResult object provided by Spring. The bind won't work as the target object of 'result' is 'MyForm' and not 'Address' ``` validate(form.getAddress2(), bindingResult) //won't work ``` I'm wondering what's the standard/clean approach to do conditional validation. I was thinking in programmatically create a new BindingResult in my controller. ``` final BindingResult bindingResultAddress2 = new BeanPropertyBindingResult(address2, "form"); validate(form.getAddress2(), bindingResultAddress2); ``` but then the List of errors I obtain from bindingResultAddress2 can't be added to the general 'bindingResult' as the field names are not correct ('street' instead of 'address2.street') and the binding won't work. Some dirty approach would be to extend BeanPropertyBindingResult to accept some string to append to the fields name.. do you have a better approach?

Original source