2015-10-30 50 views
0

我遇到了以下SpringMVC問題:有一個域對象使用某個Address子對象,但getters/setters必須調整爲使用不同地址對象通過轉換。這是一個建築要求。SpringMVC Form字段需要自定義綁定

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中,我輸入文本字段綁定到地址對象(轉換的結果),這是我們必須處理。在這個新的第二地址對象(anotherpackage.new.Address)中,有一個字段,例如「addressLine1」,這是從舊對象的「Street1」不同:

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

我的問題是,二傳手,setAddress(),不會被調用在這種情況下結合(在調試驗證)。任何解決方案?

+0

這不是一個商業需求,除非你的商業用戶也是程序員,他們'要求'你做這個特定的事情(這聽起來不太可能) 。業務需求的形式是「作爲{業務人員}我想{爲了實現業務相關的目標}以便{利益}',而且他們不應該真正談論計算機和系統。你可能意味着這是一個架構要求,這是完全不同的事情。 –

+0

我編輯了原帖 –

+0

爲了提供更新,我們設法使用JAXB的@XmlJavaTypeAdapter(Address.class)來獲得解決方法。這爲JAXB域對象提供了適配器。再次感謝 –

回答

1

的選項有:

一)不直接綁定到業務對象 B)配置的粘合劑做轉換到你的域對象

討論:

通常在企業級軟件,我們不想直接綁定到業務對象 - 通常是實體(在jpa的上下文中)。這是因爲會話處理是一個蜜蜂。通常我們使用DTO進行編碼,當從前端接收到一個數據時,我們從存儲庫(ORM)層讀取適當的對象,對其進行更新並重新保存(我只描述了更新,因爲它們是最難的,但類似的模型適用於所有事情)。

但是,spring mvc活頁夾提供了一種綁定任何東西的方法。它們有點複雜,需要花費很長時間才能在這裏解釋,但文檔位於spring documentation,您希望在轉換器和轉換服務中使用。有關於這個主題的SO Q/A,for example ...

+0

好的我會在那裏看到 –

+0

將它作爲答案中的最後一句添加了 –