1

我有一个@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;
    }
}
4

1 回答 1

1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

如果您使用 MOXy 作为您的 JAXB 提供程序,那么您可以利用外部绑定文件来覆盖您的类型的超类。

<?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>

相关问题

了解更多信息

于 2013-05-08T20:56:25.860 回答