Spring MVC связать в 2 объекта, которые имеют одинаковые поля - PullRequest
4 голосов
/ 12 января 2011

Я отправляю форму, скажем, эта форма содержит

<input name="address" ..>

и

<input name="billingAddress" ..>

У меня есть 2 объекта, к которым мне нужно привязать:

class Address {
   String address;
   ..
}

class BillingAddress {
   String address;
   ..
}

очевидно, billingAddress не будет привязываться к адресу в BillingAddress без какой-либо магии.

Допустим, у меня есть несколько одинаковых полей как в Address, так и BillingAddress, но в форме я добавляю к входным данным для биллинга billing , то есть billingFirstName, billingLastName и т. Д.

Есть ли какой-нибудь элегантный способ, которым я могу связать BillingAddress, который я могу использовать для подобных проблем?
(или есть лучший способ решить эту проблему, чем я придумал?)

1 Ответ

7 голосов
/ 12 января 2011

Если вы хотите использовать более одного 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();
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...