私はこのようにしてアーキテクチャ化されたアプリケーションを開発しています。
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の複製を避ける方法が見つかりません。それを行う方法はありますか?
ありがとうございます。
シリアライズするときBaseObjectからIDを送信するために避けることができます偉大な作品、どうもありがとうございました! :) – Berhthun