我遇到了以下SpringMVC问题:有一个域对象使用某个Address子对象,但必须调整getters / setter以通过转换使用不同的 Address对象。这是一个架构要求。
public class DomainObj {
protected DomainObj.Address address;
public anotherpackage.new.Address getAddress()
{
return convertFrom(address);
}
public void setAddress (anotherpackage.new.Address value)
{
this.address = convertTo(value);
}
}
// Internal Address object, old, #1
public static class Address {
protected String street1;
protected String street2;
// etc., getters/setters
}
现在,在JSP中,我将输入文本字段绑定到 new Address对象(转换结果),这是我们必须处理的内容。在这个新的第二个地址对象(anotherpackage.new.Address
)中,有一个字段,例如" addressLine1",这与旧对象" Street1"不同:
<form:input path="topObject.address.addressLine1" />
我的问题是setter,setAddress(),在这种情况下永远不会被调用进行绑定(在Debugger中验证)。任何解决方案吗?
答案 0 :(得分:1)
您的选择是:
a)不要直接绑定到业务对象 b)配置绑定器以转换为您的域对象
讨论:
通常在企业级软件中,我们不希望直接绑定到业务对象 - 通常是实体(在jpa的上下文中)。这是因为会话处理是蜜蜂otch。通常我们针对DTO进行编码,当从前端收到一个时,我们从存储库(ORM)层读取相应的对象,更新它,然后再将其保存(我只是描述了更新,因为它们&#39; ;最难的,但类似的模型适用于所有事情。)
然而,spring mvc binders提供了一种将任何东西绑定到任何东西的方法。它们有点复杂,这里需要花费很长时间才能解释,但是文档位于spring documentation,您希望在转换器和转换服务中使用它们。关于这个主题有{Q = A},for example ...