2016-07-28 62 views
2

我正在開發這種應用程序架構。
一個BaseObject包含以下字段:防止傑克遜@JsonIgnore引入重複

public class BaseObject { 
    private String id; 
    private Instant creationDate; 
    private String createdBy; 
    private Instant lastEditionDate; 
    private String lastEditBy; 
    private Instant deletionDate; 
    private String deletedBy; 
} 

每一個類繼承這個BaseObject所以我最終有兩個POJO的是這樣的:

public class Pojo1 extends BaseObject { 
    private SubPojo1 subPojo1; 
    private SubPojo2 subPojo2; 
} 

public class Pojo2 extends BaseObject { 
    private SubPojo3 subPojo3; 
    private SubPojo4 subPojo4; 
} 

這兩個POJO。沒有一個函數關係。它們由SubPojo組成,其中哪個組以功能方式進行。

這裏來我的問題。我的應用程序正在通過JSON將數據發送到BI應用程序。 BI應用程序需要將POJO設置爲「平面」格式,並且我想排除BaseObject字段。

所以我想出了這個:

public class FlatPojo1 extends Pojo1 { 
    @Override 
    @JsonIgnore 
    public String getId() { 
     return super.getId(); 
    } 
    /* Override every getter of BaseObjet */ 

    @Override 
    @JsonUnwrapped 
    public SubPojo1 getSubPojo1 { 
     return super.getSubPojo1(); 
    } 
    /* Override every getter of Pojo1 */ 
} 

我的解決辦法工作時,BI應用程序得到正確格式的數據,我仍然可以處理我的對象與子對象。

打擾我的東西是代碼重複。對於每個平面對象,我必須重寫我的BaseObject的每個getter。我不想。

Java不允許存在多重遺產,所以我不能創建@JsonIgnore每個BaseObject字段並擴展我的Pojo1的抽象類。

我試圖來像這樣的接口:

public interface BaseObjectInterface { 
    String getId(); 
    Instant getCreationDate(); 
    // etc 
} 

我BaseObject現在實現BaseObjectInterface,一切都是ok.Then的計劃是建立一個FlatData界面,將@JsonIgnore的BaseObject領域和每一個FlatPojo將實現這個接口。我想出了這個:

public interface FlatData extends BaseObjectInterface { 
    @Override 
    @JsonIgnore 
    default String getId() { 
     BaseObjectInterface.super.getId(); // Error 
    } 

我收到一條錯誤消息告訴我,我不能調用抽象方法。我不能在我的BaseObjectInterface中創建默認的getId()方法,因爲這樣會需要一個id字段,並且接口中的每個字段都是靜態的。

我無法找到避免重複所有這些@JsonIgnore的方法。有什麼辦法可以做到嗎?
謝謝你的幫助。

回答

2

您可以使用密新註解,其中在界面添加註釋:

public interface BaseObjectMixIn { 
     @JsonIgnore 
     String getId(); 

     ... rest of annotations for superclass 
    } 

這樣您不必添加任何東西,但混入添加到映射:

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixInAnnotations(Pojo1.class, BaseObjectMixIn.class); 

String json = mapper.writer().writeValueAsString(pojo1); 

如果你想爲每個BaseObject子類:

ObjectMapper mapper = new ObjectMapper(); 
mapper.addMixInAnnotations(BaseObject.class, BaseObjectMixIn.class); 

但是一個簡單的解決方案,沒有混入,並只增加一個接口的子類:

public interface BaseOjectInterface { 
     @JsonIgnore 
     String getId(); 
    } 

public static class Pojo1 extends BaseObject implements BaseOjectInterface { 
     private String subPojo1; 
     private String subPojo2; 

這將避免從BaseObject序列化Pojo1

+0

時發送ID偉大的作品,非常感謝你! :) – Berhthun