【问题标题】:Unexpected element (uri:"", local: "element"). Expected elements are <{}link> <{}size>意外元素(uri:“”,本地:“元素”)。预期元素是 <{}link> <{}size>
【发布时间】:2013-06-20 14:29:13
【问题描述】:

尝试解组此 xml 时:

<holder>
  <name>a</name>
  <elements>
    <element>
      <name>elem</name>
    </element>
  </elements>
</holder>

我在ValidationEventHandler 中收到错误unexpected element (uri:"", local:"element"). Expected elements are &lt;{}link&gt;,&lt;{}totalSize&gt; 并且标记&lt;elements&gt;(因此Holder 类中的elements 字段)被忽略。

在生成 XML 时,linktotalSize 都不会输出,因为它们是 nil。

JAVA 模型

层次结构有点复杂:

(为了问题而简化)

元素根

抽象ElementRoot有链接成员

public abstract class ElementRoot implements Serializable {

    protected String link;

    @XmlElement(name = "link")
    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

}

包装器

abstract Wrapper 扩展 ElementRoot 并具有 totalSize 成员

public abstract class Wrapper<T> extends ElementRoot {

    protected int totalSize;

    protected List<T> collection = new ArrayList<>();

    @XmlElement
    public int getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(int totalSize) {
        this.totalSize = totalSize;
    }

    public abstract List<T> getCollection();
}

持有人

Holder 扩展 ElementRoot

@XmlRootElement(name = "holder")
@XmlType(propOrder = {"name", "elements"})
public class Holder extends ElementRoot {

    private String name;

    private Elements elements;

    // setters and getters not annotated
}

元素

Elements 扩展 Wrapper 并拥有一个 Element 集合

import java.util.Collection;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "elements)
public class Elements extends Wrapper {

    @Override
    @XmlElement(name="element")
    public Collection<Element> getElements() {
        return elements;
    }

    // No setter, to add getElements().add(element)
}

元素

元素扩展了 ElementRoot

@XmlRootElement(name = "element")
@XmlType(propOrder = {"id", "name"})
public class Element extends ElementRoot {

     private Integer id;

     private String name;

     // setters and getters no annotated

}

环境

我正在使用java 7

JAXB-api 2.2.7
MOXy 2.5.0

【问题讨论】:

  • 根据您的描述,我在您的问题中添加了一些模型类。你是如何注释这些类的?此外,元素 datastore 应该出现在您的 XML 输入中的什么位置?
  • datastore 是原来的遗留下来的,我简化了层次结构。谢谢!

标签: java jaxb eclipselink jaxb2 moxy


【解决方案1】:

EclipseLink JAXB (MOXy) 中似乎存在与抽象 getCollecion 属性相关的用例的错误。我们打开了以下错误,您可以使用它来跟踪我们在此问题上的进展:

解决方法

包装器

我们可以使用@XmlAccessorType(XmlAccessType.NONE),以便只处理带注释的字段/属性(请参阅:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html)。

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.NONE)
public abstract class Wrapper<T> extends ElementRoot {

    protected int totalSize;

    protected List<T> collection = new ArrayList<>();

    @XmlElement
    public int getTotalSize() {
        return totalSize;
    }

    public void setTotalSize(int totalSize) {
        this.totalSize = totalSize;
    }

    public abstract List<T> getCollection();

}

元素

由于@XmlAccessorType 被子类继承,我们将指定XmlAccessType.PUBLIC 以恢复正常。注意:我假设您问题中的 getElements() 方法应该是 getCollection()

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "elements")
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
public class Elements extends Wrapper {

    @Override
    @XmlElement(name="element")
    public List<Element> getCollection() {
        return collection;
    }

    // No setter, to add getElements().add(element)
}

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2014-06-05
    相关资源
    最近更新 更多