【发布时间】: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 <{}link>,<{}totalSize> 并且标记<elements>(因此Holder 类中的elements 字段)被忽略。
在生成 XML 时,link 和 totalSize 都不会输出,因为它们是 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