是否可以在JAXB编组期间忽略包装类

Rua*_*ain 4 java xml jaxb

我正在尝试让JAXB在编组过程中忽略包装类,在代码中使用这个包装类是有意义的,因为它将所有相关信息保存在一起,但是我需要在编组过程中摆脱它.以下是相关代码.

@XmlType(name = "root")
@XmlRootElement(name = "root")
public class Root {

    @XmlElementRef
    private List<Resource> resources = new ArrayList<>();

    public void addResource(Resource resource) {
        resources.add(resource);
    }
}


@XmlRootElement(name = "", namespace = "")
@XmlAccessorType(XmlAccessType.NONE)
public class Resource {

    @XmlElementRef
    private Element element;
    @XmlElementRef
    private FieldType fieldType;
    @XmlElementRef
    private ListType listType;
}
Run Code Online (Sandbox Code Playgroud)

Root是主要对象,Resource是我不想为其创建节点的包装器对象.我仍然希望渲染资源中的Element,FieldType和ListType.

这就是我目前拥有的:

<root>
    <>
        <element name="resource1"/>
        <fieldType name="resource1--type">
        </fieldType>
        <listType name="resource--list">
        </listType>
    </>
    <>
        <element name="resource2"/>
        <fieldType name="resource2--type">
        </fieldType>
        <listType name="resource2--list">
        </listType>
    </>
</root>
Run Code Online (Sandbox Code Playgroud)

我想要实现的目标如下:

<root>
    <element name="resource1"/>
    <fieldType name="resource1--type">
    </fieldType>
    <listType name="resource--list">
    </listType>
    <element name="resource2"/>
    <fieldType name="resource2--type">
    </fieldType>
    <listType name="resource2--list">
    </listType>
</root>
Run Code Online (Sandbox Code Playgroud)

我不知道是否可能,但任何帮助将不胜感激.

谢谢.

tib*_*tof 5

你无法在JAXB中实现这一点.即使您能够像这样序列化,例如使用XmlAdapter,也无法对其进行反序列化.

试试这个:

@XmlType(name = "root")
@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.NONE)
public class Root {

    private ArrayList<Resource> resources = new ArrayList<Resource>();

    public void addResource(Resource resource) {
        resources.add(resource);
    }

    @XmlElementRefs(value = { @XmlElementRef(type = Element.class),
                              @XmlElementRef(type = ListType.class),
                              @XmlElementRef(type = FieldType.class) })
    public List<Object> getResourceFields() {
        List<Object> list = new ArrayList<Object>();
        for (Resource r : resources) {
            list.add(r.getElement());
            list.add(r.getFieldType());
            list.add(r.getListType());
        }
        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上getRerourceFields连接同一列表中的所有资源字段.如果你不能改变Root课程,这可能是你的RootAdapter,并以@Biju建议的方式使用它.