我正在開發這種應用程序架構。
一個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的方法。有什麼辦法可以做到嗎?
謝謝你的幫助。
時發送ID偉大的作品,非常感謝你! :) – Berhthun