java - 在 JAXB 编码(marshal)期间禁用 List<T> 实现者的特殊处理

标签 java jaxb jax-ws cxf jax-ws-customization

我有一个@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/

相关文章:

java - 实体类是否应该始终有 ID 字段

Java:使用 JaxB 编码到 XML,如何正确地进行多线程

Java 11 包 javax.xml.soap 不存在

eclipse - 如何修复 "Trying to write END_DOCUMENT when document has no root"错误?

java - 如何生成20个字符的随机字符串

java - 如何将一个句子分成两个单独的数组

java - 为什么在这种情况下,单参数实例方法对 BiConsumer 的类型推断不同?

用于 YAML 到 JAXB 映射的 Java 库

java - 为什么在 Apache Felix 中运行时 JAXB 找不到我的 jaxb.in​​dex?

java - 为什么 jaxws-maven-plugin 忽略我的 .WSDL 文件?