2

DBレプリケーションメカニズムを作成しています。ネットワーク経由でオブジェクトを1回送信したいだけです。オブジェクト自体をシリアル化する代わりに、UUIDを使用してオブジェクトを参照するカスタムシリアライザーを実装しました。反対側では、シリアル化されていないオブジェクトを作成するために、DBでUUIDを検索するだけです。

私が抱えている問題は、Jacksonがカスタムシリアライザーからの型IDを予期していることです。タイプIDを作成するにはどうすればよいですか?

私は次のクラスを取得しました:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY,    property="objectType")
public class Brand implements Serializable {
    private String uuid;

    @JsonSerialize(using = EntitySerializer.class)
    private Producer producer = null;

    // Omitting getters and setters
}

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="objectType")
public class Producer extends Entity implements Serializable {
    private String uuid;
    private String name;

    //Omitting getters and setters.
}

Producerをシリアル化するために、次のシリアライザーを入手しました。

public class EntitySerializer extends JsonSerializer<Entity> {
    @Override
    public void serialize(Entity value, JsonGenerator jgen,
        SerializerProvider provider) throws IOException,
        JsonProcessingException {
    jgen.writeString(value.getUUID());  
}

}

シリアル化すると、@ JsonTypeInfoタイプIDが生成されないため、次のエラーが発生します。

com.fasterxml.jackson.databind.JsonMappingException: Type id handling not implemented for type com.fodolist.model.Producer (through reference chain: com.fodolist.server.callprocessor.SyncContainter["one"]->com.fodolist.model.Brand["producer"])

問題を解決するためのより良い方法はありますか?

4

2 に答える 2

0

多分見てください@JsonIdentityInfo; IDジェネレーターの1つは、IDとして使用するUUIDを作成します。デフォルトでは、最初のインスタンスは完全にシリアル化されます(そうでない場合、データを逆シリアル化することはできません)が、を使用@JsonIdentityReferenceして、すべてのインスタンスがIDのみを使用してシリアル化されることを示すことで変更できます(生成されるか、プロパティを介してアクセスされます) )。

于 2013-02-22T19:28:33.227 に答える
0

uuidフィールドがすでに設定されている場合は、次のようにPropertyGeneratorを使用できます。

@JsonIdentityInfo(generator =  ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
public class Producer extends Entity {
....
}
于 2013-02-23T01:33:50.283 に答える