我有一个@XmlTransient
类名为 ListBase<T>
它实现了 List<T>
。然后我将该列表子类为 @XmlType StringList
, @XmlType PersonList
等
JAXB 似乎以特殊方式处理此类,例如当该类的实例是其他类的成员时,该成员将被编码(marshal)为
<xs:element maxOccurs="unbounded" type="whatever the type of T" .../>
而不是
<xs:element type="type of my list implementor" .../>`
也就是说,列表的内容而不是列表本身被整理。
类(class)ListBase<T>
实现List<T>
通过封装,即它有一个 List<T>
类型的字段它通过标记为 @XmlElement
的访问器公开该字段以便内部列表与类型一起编码。如果我删除 implements List<T>
从我的列表实现者中,我得到了第二个(所需的)变体,但这意味着修改应用程序的其余部分,以便它了解封装。
如何禁用对 List 实现者的特殊处理,以便将其像任何其他非集合复杂类型一样进行编码(marshal)?
@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;
}
}
最佳答案
注意:我是EclipseLink JAXB (MOXy) JAXB (JSR-222) 的领导者和成员专家组。
如果您使用 MOXy 作为 JAXB 提供程序,那么您可以利用外部绑定(bind)文件来覆盖您类型的父类(super class)。
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum116436770">
<java-types>
<java-type name="StringList" super-type="java.lang.Object" />
</java-types>
</xml-bindings>
相关问题
了解更多信息
关于java - 在 JAXB 编码(marshal)期间禁用 List<T> 实现者的特殊处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16436770/