意外的元素(uri:“”,local:“element”)。预期元素为< {} link> < {}大小>

时间:2013-06-20 14:29:14

标签: java jaxb eclipselink jaxb2 moxy

尝试解组此xml:

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

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

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

JAVA模型

层次结构有点复杂:

(为了问题而简化)

ElementRoot

abstract 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)
}

元素

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

1 个答案:

答案 0 :(得分:1)

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

周围工作

包装

我们可以使用@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)
}