3

尝试解组此 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两者时link,并且totalSize不输出,因为它们是零。

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
4

1 回答 1

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)
}
于 2013-06-21T10:07:24.393 回答