尝试解组此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
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
答案 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)
}