SpringMVC表单字段

时间:2015-10-30 17:54:20

标签: spring-mvc spring-mvc-initbinders

我遇到了以下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中验证)。任何解决方案吗?

1 个答案:

答案 0 :(得分:1)

您的选择是:

a)不要直接绑定到业务对象 b)配置绑定器以转换为您的域对象

讨论:

通常在企业级软件中,我们不希望直接绑定到业务对象 - 通常是实体(在jpa的上下文中)。这是因为会话处理是蜜蜂otch。通常我们针对DTO进行编码,当从前端收到一个时,我们从存储库(ORM)层读取相应的对象,更新它,然后再将其保存(我只是描述了更新,因为它们&#39; ;最难的,但类似的模型适用于所有事情。)

然而,spring mvc binders提供了一种将任何东西绑定到任何东西的方法。它们有点复杂,这里需要花费很长时间才能解释,但是文档位于spring documentation,您希望在转换器和转换服务中使用它们。关于这个主题有{Q = A},for example ...