使用Jackson使用SuperBuilder序列化抽象类

zaqlnxep  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(170)

我有以下课程:

@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
public abstract class Parent {
    private String parentA;
    private String parentB;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
public class ChildOne extends Parent{
    private String childOneA;
    private String childOneB;
}
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
public class ChildTwo extends Parent{
}
Map<Parent, List<String>> parent2Strs = new HashMap<>();
parent2Strs.put(ChildTwo.builder().parentA("A").parentB("B").build(), List.of("1", "2"));
parent2Strs.put(ChildTwo.builder().parentA("C").parentB("D").build(), List.of("1"));

当我在parent 2Str类上调用writeValueAsString()方法时,它不会打印父类中的任何属性。
我尝试在抽象类上使用@Jacksonized。但收到错误:
错误:抽象类上的构建器不能被@ Jackson化(构建器将永远不会被使用)。
如何在序列化子类时包含父类中的字段?

zbq4xfa0

zbq4xfa01#

此行为与Lombok、@SuperBuilder@Jacksonized无关。Jackson只是使用toString()方法序列化map键,因为JSON中的键不能被结构化,而必须是普通字符串。
如果使用POJO作为map值,则一切都按预期工作(即使没有@SuperBuilder也能正常工作)。
@Jacksonized不会有任何影响,因为它只影响反序列化,而不影响序列化。

相关问题