我在使用JAXB解组一个已关闭对象列表时遇到了一些问题(在我无法添加JAXB注释的意义上关闭)。基本上,我的XML看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<!-- SNIP! -->
</rdf:RDF>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<!-- SNIP! -->
</rdf:RDF>
</document>
我的文档类是:
@XmlRootElement(name = "document", namespace = Namespace.DEFAULT_NAMESPACE)
@XmlAccessorType(XmlAccessType.FIELD)
public class Document {
@XmlJavaTypeAdapter(ModelAdapter.class)
@XmlElement(name = "RDF", namespace = Namespace.RDF_NAMESPACE)
private List<Model> models;
....
其中Model是一个框架中的类,我无法添加JAXB注释,因此适配器。
ModelAdapter的实现如下:
public class ModelUnmarshalAdapter extends ModelAdapter<Object, Model> {
@Override
public Model unmarshal(final Object v) throws Exception {
// Turn incoming Node into a Model object
Model model = convert(v);
return model;
}
....
}
当我解组XML时,我发现ModelUnmarshalAdapter.unmarshal()按预期被调用两次(由于XML中有2个RDF元素),但Document instance models属性始终为null。这就像它没有实例化必要的列表实例。
任何想法都会受到极大的关注。
由于
尼克
答案 0 :(得分:0)
经过多次尝试和错误后,事实证明解决方案是继承封闭对象具体类(在我的案例中,ModelCom,实现Model接口)并将@XmlJavaTypeAdapter添加到
@XmlJavaTypeAdapter(ModelAdapter.class)
public class MyModel extends ModelCom {
public Model(Graph base) {
super(base);
}
public Model(Graph base, Personality<RDFNode> personality) {
super(base, personality);
}
}
Document类现在只是
public class Document {
@XmlElement(name = "RDF", namespace = Namespace.RDF_NAMESPACE)
private List<MyModel> models;