我有以下类:
@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"));
当我在parent2Str类上调用writeValueAsString()方法时,它不打印父类中的任何属性。
我尝试在抽象类上使用@Jacksonized。但是收到错误:
错误:抽象类上的构造器不能被@Jacksonized(构造器永远不会被使用)。
如何在序列化子类时包含父类中的字段?
此行为与Lombok、@SuperBuilder
或@Jacksonized
无关。Jackson简单地使用toString()
方法序列化map键,因为JSON中的键不能结构化,而必须是普通字符串。
如果您使用pojo作为映射值,一切都如预期的那样工作(没有@SuperBuilder
也可以工作)。
@Jacksonized
无论如何都不会产生影响,因为它只影响反序列化,而不影响序列化。