我正在制作数据库复制机制。我只想通过网络发送一个对象。我已经实现了一个自定义序列化程序,它使用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"])
有没有更好的方法来解决问题?
答案 0 :(得分:0)
也许看看@JsonIdentityInfo
;其中一个id生成器创建UUID以用作id。默认情况下,第一个实例将完整地序列化(否则无法反序列化数据),但您可以通过使用@JsonIdentityReference
来指示所有实例仅使用id(生成)进行序列化来更改它,或通过财产访问)。
答案 1 :(得分:0)
如果已经设置了uuid字段,您可以使用PropertyGenerator,如下所示:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "uuid")
public class Producer extends Entity {
....
}