永恒的龙目岛与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 } } 

POJO大纲

这是一个用于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); } }