永恒的龙目岛与jackson注释的类
创建类的首选方法是什么?
- 不可变
- 可以使用Jackson序列化/反序列化
- 人性化,低水平的样板
最好,我会喜欢这样的工作:
@Data(onConstructor = @__(@JsonCreator))
然后让所有领域成为private final
。 但是,这甚至没有编译(我不知道为什么)。 运用
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
将编译,但只收益
InvalidDefinitionException: No serializer found for class
您可以使用Lombok的@Builder
批注为您的不可变POJO类生成构建器。 但是让jackson的反序列化使Lombok生成的构建器可用是有点棘手的。
- 您需要使用
@JsonDeserialize(builder = ...)
注释您的POJO类,以告诉Jackson哪个是要使用的构建器类。 - 您需要使用
@JsonPOJOBuilder(withPrefix = "")
来注释构建器类,以告诉Jackson其setter方法不能从中开始。
例:
一个不可变的POJO类:
@Data @Builder(builderClassName = "PointBuilder") @JsonDeserialize(builder = Point.PointBuilder.class) public class Point { private final int x; private final int y; @JsonPOJOBuilder(withPrefix = "") public static class PointBuilder { // Lombok will add constructor, setters, build method } }
这是一个用于validation序列化/反序列化的JUnit测试:
public class PointTest extends Assert { private ObjectMapper objectMapper = new ObjectMapper(); @Test public void testSerialize() throws IOException { Point point = new Point(10, 20); String json = objectMapper.writeValueAsString(point); assertEquals("{\"x\":10,\"y\":20}", json); } @Test public void testDeserialize() throws IOException { String json = "{\"x\":10,\"y\":20}"; Point point = objectMapper.readValue(json, Point.class); assertEquals(new Point(10, 20), point); } }