我在使用 JAXB 注释的杰克逊的 ObjectMapper 时遇到问题。具体来说,我正在收集带有接口通用信息的集合,虽然我可以反序列化来自 XML 的输入,但对于 Jackson(使用 JAXB 内省)来说这是不可能的。也许我只是缺少一些配置属性或 JAXB 注释?问题是“抽象类型只能用额外的类型信息来实例化”,我认为带有类型信息的@XmlElementRef(或@XmlElement)可以解决这个问题,但显然它没有。
请注意,如果可能,我只想保留 JAXB 注释。例如,使用@JsonTypeInfo 或@JsonDeserialize 将是最后要做的事情。
IEntry.java:
@XmlSeeAlso(Entry.class)
public interface IEntry {
String getValue();
}
入口.java:
@XmlRootElement(name = "entry")
public class Entry implements IEntry {
@XmlElement(name = "value")
String value;
public Entry() {
}
public Entry(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
聚合器.java:
@XmlRootElement(name = "aggregator")
public class Aggregator {
@XmlElementRef(type = Entry.class)
private Set<IEntry> entries;
public Aggregator() {
}
public Aggregator(Set<IEntry> entries) {
this.entries = entries;
}
public Set<IEntry> getEntries() {
return entries;
}
}
测试方法:
@Test
public void testSerialization() throws Exception {
ObjectMapper om = new ObjectMapper();
AnnotationIntrospector intr = new JaxbAnnotationIntrospector();
om.getDeserializationConfig().withAnnotationIntrospector(intr);
String json = "{\"entries\":[{\"value\":\"X\"},{\"value\":\"Y\"},{\"value\":\"Z\"}]}\";\n}";
Aggregator agr = om.readValue(json, Aggregator.class);
}
感谢所有回复