使用值对象作为实体ID时自定义Jackson序列化

时间:2015-12-08 10:41:36

标签: java json serialization

我想在我的实体中使用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超类)。我可以为每个实体编写序列化器和反序列化器,但我希望有更通用的解决方案。

1 个答案:

答案 0 :(得分:1)

使用@JsonUnwrapped。它也可以与具有单一属性的对象完美配合,IIRC。

http://fasterxml.github.io/jackson-annotations/javadoc/2.1.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html