【问题标题】:Custom Binding Required for SpringMVC Form FieldSpringMVC 表单字段需要自定义绑定
【发布时间】:2015-10-30 17:54:20
【问题描述】:

我遇到了以下 SpringMVC 问题:有一个域对象使用某个 Address 子对象,但必须调整 getter/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 地址对象(转换的结果),这是我们必须处理的。在这个新的第二地址对象 (anotherpackage.new.Address) 中,有一个字段,例如“addressLine1”,与旧对象的“Street1”不同:

<form:input path="topObject.address.addressLine1" />

我的问题是设置器 setAddress() 在这种情况下永远不会被调用以进行绑定(在调试器中验证)。有什么解决办法吗?

【问题讨论】:

  • 这不是业务要求,除非您的业务用户也是程序员并且他们“要求”您执行此特定操作(这听起来不太可能)。业务需求以“作为{业务人员}我想{实现业务相关目标}以便{好处}”的形式出现,他们不应该真正谈论计算机和系统。您可能的意思是这是一个架构要求,这是完全不同的事情。
  • 我编辑了原帖
  • 只是为了提供一个更新,我们设法使用 JAXB 的 @XmlJavaTypeAdapter(Address.class) 获得了解决方法。这在 JAXB 域对象端提供了适配器。再次感谢

标签: spring-mvc spring-mvc-initbinders


【解决方案1】:

您的选择是:

a) 不要直接绑定到业务对象 b) 配置一个活页夹来转换为您的域对象

讨论:

通常在企业级软件中,我们不想直接绑定到业务对象——通常是实体(在 jpa 的上下文中)。这是因为会话处理是一个小问题。通常我们针对 DTO 进行编码,当从前端接收到一个对象时,我们从存储库 (ORM) 层读取适当的对象,对其进行更新,然后再次将其保存回来(我只描述了更新,因为它们是最难的,但类似的模型适用于所有事物)。

但是,spring mvc binders 提供了一种将任何东西绑定到任何东西的方法。它们有点复杂,在这里解释起来需要很长时间,但是文档在spring documentation 中,您想寻找转换器和转换服务。有关于这个主题的 SO Q/A,for example...

【讨论】:

  • 将其添加为答案中的最后一句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2014-01-12
相关资源
最近更新 更多