如何使用Custom Serializer创建类型ID?

时间:2013-02-22 11:05:04

标签: json jackson

我正在制作数据库复制机制。我只想通过网络发送一个对象。我已经实现了一个自定义序列化程序,它使用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"])

有没有更好的方法来解决问题?

2 个答案:

答案 0 :(得分:0)

也许看看@JsonIdentityInfo;其中一个id生成器创建UUID以用作id。默认情况下,第一个实例将完整地序列化(否则无法反序列化数据),但您可以通过使用@JsonIdentityReference来指示所有实例仅使用id(生成)进行序列化来更改它,或通过财产访问)。

答案 1 :(得分:0)

如果已经设置了uuid字段,您可以使用PropertyGenerator,如下所示:

@JsonIdentityInfo(generator =  ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
public class Producer extends Entity {
....
}