gpt4 book ai didi

data-binding - spring mvc绑定(bind)到2个具有相同字段的对象

转载 作者:行者123 更新时间:2023-12-04 05:10:38 27 4
gpt4 key购买 nike

我提交了一个表格,假设这个表格包含

<input name="address" ..>


<input name="billingAddress" ..>

我有 2 个需要绑定(bind)的对象:
class Address {
String address;
..
}

class BillingAddress {
String address;
..
}

显然 billingAddress不会绑定(bind)到 BillingAddress 中的地址没有一些魔法。

假设我在两个 Address 中都有多个相同的字段和 BillingAddress但在表格上,我在计费输入前加上计费,即 billingFirstName、billingLastName 等。

有什么优雅的方法可以绑定(bind)到 BillingAddress我可以重复使用类似的问题吗?
(或者有没有比我想出的更好的方法来解决这个问题?)

最佳答案

如果您想使用多个 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" ..>

Controller :
@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 使用自定义验证器,您还必须创建一个调用 AddressValidator 和 BillingAddressValidator 的 FormModelValidator:
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();
}
}

}

关于data-binding - spring mvc绑定(bind)到2个具有相同字段的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4665587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com