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();