如果你的魔杖使用一個以上的ModelAttribute,你必須創建一個包裝對象,它擁有的一個實例每個ModelAttribute。在你的情況下,我會創建一個叫做「FormModel」的包裝對象,它包含一個地址實例和一個BillingAddress實例。
class FormModel {
private Address address;
private BillingAddress billingAddress;
// Getters and Setters
}
現在使用FormModel作爲ModelAttribute。 在你的表格,你可以定義你的輸入元素,如:
<input name="address.address" ..>
<input name="billingAddress.address" ..>
控制器:
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(Model model, @ModelAttribute() FormModel formModel) {
// process formModel.getAddress()
// process formModel.getBillingAddress()
return "redirect:home";
}
如果您使用的地址和BillingAddress自定義驗證,你還可以創建一個調用AddressValidator對象一個FormModelValidator和BillingAddressValidator:
public class FormModelValidator implements Validator {
private final AddressValidator addressValidator;
private final BillingAddressValidator billingAddressValidator;
public FormModelValidator(AddressValidator addressValidator,
BillingAddressValidator billingAddressValidator) {
this.addressValidator = addressValidator;
this.billingAddressValidator = billingAddressValidator;
}
public boolean supports(Class<?> clazz) {
return FormModel.class.equals(clazz);
}
public void validate(Object target, Errors errors) {
FormModel formModel = (FormModel) target;
try {
errors.pushNestedPath("address");
ValidationUtils.invokeValidator(this.addressValidator,
formModel.getAddress(), errors);
} finally {
errors.popNestedPath();
}
try {
errors.pushNestedPath("billingAddress");
ValidationUtils.invokeValidator(this.billingAddressValidator,
formModel.getBillingAddress(), errors);
} finally {
errors.popNestedPath();
}
}
}
這給了我一個新問題;)我嘗試驗證BillingAddress和AddressObjects使用自己的驗證器,但BindingResult object指的是FormModel對象,因此無法找到錯誤的其他2個對象的任何字段。 – mkoryak 2011-01-12 18:53:33