Jackson Faster XML:如何解析抽象类的子类?混音?



我们通过xcj使用来自架构的生成对象类型。因此,对类型定义的灵活控制不是很灵活。我们还使用JAXB注释。

然后,我们使用杰克逊更快的XML进行这些对象的估算化。不幸的是,当我们对抽象类进行挑选时,我们会得到一个例外:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of 
com.x.y.z.AnstractType: abstract types either need to be mapped to concrete types, 
have custom deserializer, or contain additional type information at 
[Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@2989b3db; 
line: 1, column: 625] (through reference chain: com.x.y.z.TypeA["type-b-prop"]->
com.x.y.z.TypeB["type-c-prop"]->java.util.ArrayList[0]->
com.x.y.z.TypeC["abstract-type-prop"]->java.util.ArrayList[0])

通过添加mixin:

@JsonTypeInfo(defaultImpl = ChildType.class, use = JsonTypeInfo.Id.MINIMAL_CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
static class AbstractTypeMixIn {
}

并将其注册在对象映射器中:

objectMapper = new ObjectMapper();
objectMapper.addMixIn(AbstractType.class, AbstractTypeMixIn.class);
...
objectMapper.registerModule(new JaxbAnnotationModule());    

当单个类遗传抽象效果时,这就像魅力一样。那多个孩子呢?有什么想法如何将其用于抽象类的多个遗传因素?如果不是混合物,还有什么?

问题是我仅使用混合蛋白来解析响应,但不编写它。因此,解决方案是使用相同的混合蛋白作为对象映射器的 serialization and delelialization 。以下定义就足够了:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
static class AbstractTypeMixIn {
}

它只会在JSON中添加 @type属性,以示模棱两可的儿童课程。

@JsonSubTypes注释可能对您有用。请参阅杰克逊的@jsonsubtypes是多态避难所所必需的吗?有关详细信息

相关内容

  • 没有找到相关文章

最新更新