我想在我的实体中使用Value Object作为数据库ID。我也想要干净的JSON。假设我有这个实体:
private static class TestEntity {
private TestEntityId id;
private String mutableProperty;
public TestEntity(TestEntityId id) {
this.id = id;
}
public TestEntityId getId() {
return id;
}
public String getMutableProperty() {
return mutableProperty;
}
public void setMutableProperty(String mutableProperty) {
this.mutableProperty = mutableProperty;
}
}
哪个有这个id类:
private static class TestEntityId extends ImmutableEntityId<Long> {
public TestEntityId(Long id) {
super(id);
}
}
如果我使用杰克逊的默认设置,我明白了:
{"id":{"id":1},"mutableProperty":"blabla"}
但我想得到这个:
{"id":1,"mutableProperty":"blabla"}
我设法通过添加自定义序列化器来获得序列化:
addSerializer(ImmutableEntityId.class, new JsonSerializer<ImmutableEntityId>() {
@Override
public void serialize(ImmutableEntityId immutableEntityId, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
jsonGenerator.writeNumber( (Long)immutableEntityId.getId() );
}
});
(我知道演员阵容不是很好,但为了问题的目的,请忽略它。)
问题是如何为它编写反序列化器?以某种方式杰克逊应该跟踪,在反序列化TestEntity
时,他需要创建一个TestEntityId
实例(而不是ImmutableEntityId
超类)。我可以为每个实体编写序列化器和反序列化器,但我希望有更通用的解决方案。
答案 0 :(得分:1)
使用@JsonUnwrapped。它也可以与具有单一属性的对象完美配合,IIRC。