2017-05-15 22 views
0

ビューに基づいてプロパティをシリアル化しようとしています。残念なことに、以下のコードは、Jacksonが「userId」と矛盾したゲッター・プロペターティを報告しているので動作しません。特定の表現のビューに基づいてオブジェクトを取得する方法はありますか?Jackson JSONのビューによる逆シリアル化

@JsonView(Views.Mongo.class) 
    @JsonProperty("userId") 
    public ObjectId getUserId() { 
     return userId; 
    } 

    @JsonView(Views.Frontend.class) 
    @JsonProperty("userId") 
    public String getUserIdAsString() { 
     return userId.toString(); 
    } 

これは私が欲しいものです:

ビュー1:

{ userId: { '$oid' : "16418256815618" } } 

ビュー2:

{ userId: "16418256815618" } 

答えて

0

私はあなたがこのタスクは、ベースのないカスタム・シリアライザを書くことができると思います以下に示すようにアクティブビュー上に表示されます。

@JsonSerialize(using=ObjectIdSerializer.class) 
public ObjectId getUserId() { 
    return userId; 
} 

以下のように

public class ObjectIdSerializer extends JsonSerializer<ObjectId> { 

    @Override 
    public void serialize(ObjectId objectId, JsonGenerator gen, SerializerProvider provider) throws IOException { 
     if (provider.getActiveView() == Frontend.class) { 
      gen.writeString(objectId.toString()); 
     } else { 
      // Do default serialization of ObjectId. 
      gen.writeStartObject(); 
      gen.writeFieldName("idField1"); 
      gen.writeString(objectId.getIdField1()); 
      gen.writeFieldName("idField2"); 
      gen.writeString(objectId.getIdField2()); 
      gen.writeEndObject(); 
     } 
    } 
} 

そして、あなたはそれがカスタム・シリアライザで世話をしているとしてあなたのgetter /フィールド上の任意のビューの注釈を渡す必要はありませんあなたのPOJOを変更します。

この例では、デフォルトのシリアル化を手動で行っています。代わりに、質問How to access default jackson serialization in a custom serializerで説明されているシリアライザ修飾子を登録して、デフォルトのシリアライザを使用してシリアライザを実行することもできます。

+0

ありがとうございます!それは私のために働いた。 – user2443205

関連する問題