Если вы хотите использовать более одного ModelAttribute, вы должны создать объект-оболочку, который содержит экземпляр каждого ModelAttribute.В вашем случае я бы создал объект-оболочку с именем «FormModel», который содержит экземпляр Address и экземпляр 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";
}
Если вы используете пользовательские валидаторы для Address и BillingAddress, вам также необходимо создать FormModelValidator, которыйвызывает AddressValidator и 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();
}
}
}