検証したいフォームがあります。2つのアドレス変数が含まれています。address1は常に検証する必要があり、address2はいくつかの条件に基づいて検証する必要があります
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オブジェクトを再利用できないことです。'result'のターゲットオブジェクトが'MyForm'であり、'Address'ではないため、バインドは機能しません
validate(form.getAddress2(), bindingResult) //won't work
条件付き検証を行うための標準/クリーンなアプローチは何でしょうか。
私は、コントローラーで新しいBindingResultをプログラムで作成することを考えていました。
final BindingResult bindingResultAddress2 = new BeanPropertyBindingResult(address2, "form");
validate(form.getAddress2(), bindingResultAddress2);
ただし、フィールド名が正しくないため('address2.street'ではなく'street')、バインディングが機能しないため、bindingResultAddress2から取得したエラーのリストを一般的な'bindingResult'に追加できません。
いくつかの汚いアプローチは、BeanPropertyBindingResultを拡張して、フィールド名に追加する文字列を受け入れることです。より良いアプローチはありますか?