【问题标题】:Problems with JAXB marshalling lists of non-annotated objectsJAXB 编组非注释对象列表的问题
【发布时间】:2014-09-18 17:41:55
【问题描述】:

我在使用 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>

我的 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 实例模型属性始终为空。好像它没有实例化必要的列表实例。

我们将不胜感激任何想法。

谢谢

尼克

【问题讨论】:

  • 我不太相信XmlAdapter&lt;?,?&gt;ModelAdapter&lt;Object, Model&gt; 的继承结构,它缺失但设置为@XmlJavaTypeAdapterModelUnmarshalAdapter,(如您所说)通过调用unmarshal。这里需要一整套重现错误的java代码——否则都是猜测,

标签: java jaxb unmarshalling


【解决方案1】:

经过多次尝试和错误,解决方案是子类化封闭对象具体类(在我的例子中是实现 Model 接口的 ModelCom)并将@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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2011-04-10
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多