2

我正在制作数据库复制机制。我只想通过网络发送一个对象。我已经实现了一个自定义序列化程序,它使用 UUID 引用对象,而不是序列化对象本身。另一方面,我打算只在 DB 中查找 UUID 以创建非序列化对象。

我遇到的问题是杰克逊希望我的自定义序列化程序有一个类型 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

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

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

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

于 2013-02-22T19:28:33.227 回答