2017-02-23 4 views
1

私は所有していないjava APIを使用していますが、変更できません。このAPIはクラスAggregationを定義しています。Immutables(immutables.github.io)の抽象クラスで、ジャクソンのシリアル化とデシリアライズが定義されています。私は、シリアル化時にピックアップされるべき集約するフィールドを追加したい Jacksonサブクラスのシリアル化

@Value.Immutable 
@JsonSerialize(as = Immutable_Aggregation.class) 
@JsonDeserialize(as = Immutable_Aggregation.class) 
public abstract class Aggregation { 

よう

クラスが見えますが、のインスタンスがまだAggregationを受け入れる方法に渡すことができます。

public abstract class ExtendedAggregation extends Aggregation {} 

これが可能である:

は、私のような何かがしたいですか?

答えて

1

@Value.Immutableという2つのクラスの間で継承を管理していないため、代わりにJacksonを使用して問題を解決しようとしました。

注釈とmixinsを使用して、Aggregationクラスに触れることなくプロパティを追加する次の方法が見つかりました。

まず、アノテーションでミックスインクラスを定義します。

@JsonAppend(
    attrs = { 
     @JsonAppend.Attr(value = "version") 
}) 
public class AggregationMixin {} 

あなたObjectMapperインスタンスとミックスインを登録します。

mapper.addMixIn(Aggregation.class, AggregationMixin.class); 

は、あなたここで、専用ObjectWriterを作成することにより、クラスをシリアル化追加されたプロパティの値を指定します。

ObjectWriter writer = om.writerFor(Aggregation.class).withAttribute("version", "42"); 
...  
String output = writer.writeValueAsString(aggregationInstance); 

@JsonAppend注釈は、さまざまな方法でその値を取得するように設定できます。詳細については、ドキュメントを参照してください。

さらにいくつかの読書:

http://www.baeldung.com/jackson-advanced-annotations#jsonappend http://wiki.fasterxml.com/JacksonMixInAnnotations

+1

私にはよさそうです – marisbest2

関連する問題