2016-07-28 2 views
2

私はこのようにしてアーキテクチャ化されたアプリケーションを開発しています。
A BaseObjectは、以下のフィールドが含まれています。これら二つのPOJOは、機能的な関係を持っていないJackson @JsonIgnoreが複製を導入しないようにする

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

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

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を拡張するので、私はこのような2つの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のすべてのゲッターをオーバーライドする必要があります。私はしたくないです。

Javaは複数の伝承を許可していないので、すべてのBaseObjectフィールドに@JsonIgnoreという抽象クラスを作成することはできません。また、私のPojo1も拡張できます。

私はこのようなインターフェイスが付属してみました:

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

マイBaseObjectは今BaseObjectInterfaceを実装し、すべてが計画はBaseObjectフィールドを@JsonIgnoreますFlatDataインターフェイスごとFlatPojoを作成することですok.Thenされますこのインタフェースを実装します。私はこれを思いついた:

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; 

これはPojo1

+0

シリアライズするときBaseObjectからIDを送信するために避けることができます偉大な作品、どうもありがとうございました! :) – Berhthun

関連する問題