我有以下Jaxb注释的类层次结构,包括文档根元素的继承:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParentClass", propOrder = {
"parentField"
})
public class ParentClass{
@XmlElement(name = "ParentField")
protected String parentField;
getters and setters here
}
ChildAClass:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChildAClass", propOrder = {
"childAfield"
})
public class ChildAClass extends ParentClass{
@XmlElement(name = "ChildAfield")
protected String childAfield;
getters and setters here
}
ChildBClass:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChildBClass", propOrder = {
"childBfield"
})
public class ChildBClass extends ParentClass{
@XmlElement(name = "ChildBfield")
protected String childBfield;
getters and setters here
}
这是相当简单的类层次结构。而不是使用简单的测试来序列化ChildAClass并尝试反序列化为ParentClass。我期望propper类被反序列化回ParentClass。我想这是一个有效的用例。
序列化文档如下所示,这里没有什么特别之处。
{
"ChildAfield": "child A field",
"ParentField": "parent from child A"
}
但当我试图反序列化时:
mapper = new ObjectMapper();
JaxbAnnotationModule jaxbAnnotationModule = new JaxbAnnotationModule();
mapper.registerModule(jaxbAnnotationModule);
mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
mapper.configure(SerializationFeature.WRITE_ENUMS_USING_INDEX, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_
ParentClass parentClass = mapper.readValue(new File(PATH_TO_FILE), ParentClass.class);
我得到以下例外:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "ChildAfield" (class inheritance.model.ParentClass), not marked as ignorable (one known property: "ParentField"])
at [Source: src/test/resources/testfiles/json/inheritance.json; line: 2, column: 19] (through reference chain: inheritance.model.ParentClass["ChildAfield"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79)
at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty( ...
我假设这里缺少一些类型元数据,用于propper类型推断和反序列化。我正在寻找@JsonTypeInfo,但我仅限于JAXB。我尝试了@XmlElements注释,但未能使其工作。
谁能给点提示吗?
Thx
发布于 2015-04-12 14:38:44
我明白了为什么这不起作用。继承结构确实与“格式良好的文档”匹配,但是在类型标记的情况下,文档将有一个不同的根元素,这取决于所使用的子类。它可能可以通过使用自定义XmlTypeAdapter来解决。在我看来,以下是最简单的方法。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RootClass", propOrder = {
"parentClass"
})
public class RootClass {
@XmlElements({
@XmlElement(name = "ChildAClass", type = ChildAClass.class),
@XmlElement(name = "ChildBClass", type = ChildBClass.class)
})
protected ParentClass parentClass;
... getters and setters
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ParentClass", propOrder = {
"parentField"
})
public class ParentClass{
@XmlElement(name = "ParentField")
protected String parentField;
... getters and setters
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChildAClass", propOrder = {
"childAfield"
})
public class ChildAClass extends ParentClass{
@XmlElement(name = "ChildAfield")
protected String childAfield;
... getters and setters
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChildBClass", propOrder = {
"childBfield"
})
public class ChildBClass extends ParentClass{
@XmlElement(name = "ChildBfield")
protected String childBfield;
... getters and setters
}
https://stackoverflow.com/questions/29570378
复制相似问题