JAXB编组非注释对象列表的问题

时间:2014-09-16 15:02:40

标签: java jaxb unmarshalling

我在使用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。这就像它没有实例化必要的列表实例。

任何想法都会受到极大的关注。

由于

尼克

1 个答案:

答案 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;