我有一个@XmlTransient
名为ListBase<T>
which implements的类List<T>
。然后我将该列表子类化为@XmlType StringList
,@XmlType PersonList
等。
似乎 JAXB 以一种特殊的方式处理此类类,例如当该类的实例是某个其他类的成员时,该成员将被编组为
<xs:element maxOccurs="unbounded" type="whatever the type of T" .../>
代替
<xs:element type="type of my list implementor" .../>`
也就是说,列表的内容被编组而不是列表本身。
该类通过封装ListBase<T>
实现List<T>
,即它有一个类型字段,List<T>
并通过标记为的访问器公开该字段,@XmlElement
以便内部列表与该类型一起编组。如果我implements List<T>
从我的列表实现者中删除,那么我会得到第二个(所需的)变体,但这意味着修改应用程序的其余部分,以便它知道封装。
如何禁用对我的 List 实现者的特殊处理,以便将其编组为任何其他非集合复杂类型?
@XmlTransient
public abstract class ListBase<T> implements List<T> {
protected List<T> list;
public ListBase(List<T> list) {
this.list = list;
}
public ListBase() {
this(new ArrayList<T>());
}
public abstract List<T> getList();
public abstract void setList(List<T> value);
//The rest is List<T> implementation using encapsulation of this.list
//...
}
@XmlType(name = "ArrayOfstring", namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays")
@XmlAccessorType(XmlAccessType.NONE)
public class StringList extends ListBase<String> {
public StringList(List<String> list) {
super(list);
}
public StringList() {
super();
}
@XmlElement(name = "string")
public List<String> getList() {
return list;
}
public void setList(List<String> value) {
this.list = value;
}
}