2013-10-22 25 views
1

我想代碼域對象,可以從其他對象實現相同的接口創建自己。我也編碼它,以便他們可以將自己轉換爲其他實現,基本上簡單的域轉移對象。我使用jackson在實現之間自動轉換,以減少容易出錯的鍋爐板手動對象轉換。傑克遜,繼承,域對象和泛型

它可能更容易用一個例子來說明:

//base class 
public abstract class DO<T extends Object> { 
    public abstract T toDTO(); 
    public abstract DO<T> fromDTO(T t); 
} 

//concrete implementation 
public class MyDO extends DO<MyDOInterface> implements MyDOInterface { 

    public MyDO fromDTO(MyDTO r){ 
    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.convertValue(r, MyDO.class);  
    } 

    public MyDTO toDTO() { 
    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.convertValue(this, MyDO.class); 
    } 

    //getters and setters from MyDOInterface 
} 

現在創造的DTO時能正常工作,但它是一個有點疼痛的其他方式。要創建我的域對象,我必須這樣做:

MyDO myDO = new MyDO().fromDTO(aDTOInstance); 

它創建一個空對象以便從其上調用DTO(...)。

我有一種感覺,我錯過了簡單的東西,要麼讓我在構造函數或靜態方法中通過DTO來避免這種情況。或者甚至是DO本身的工廠方法,但我無法弄清楚它是什麼。任何人都可以看到使這項工作的方式?

回答

0

也許看看@JsonCreator註釋:它允許您標記要使用的構造函數和(靜態)工廠方法。具體而言,所謂的「委託」創建者如: 序列化時的另一種可能性是@JsonValue,它允許在序列化過程中進行某些轉換。

我不知道這些是否有助於解決具體問題,因爲您正在進行的轉換多於閱讀/編寫JSON,但它們似乎相關。

+0

乾杯。我確實需要更多關注@JsonCreator的工作原理。我已經到了與我的特定域對象(mongodb DBObjects)配合良好的地步,但我無法獲得一個通用的解決方案。 – tom