8

我们有一个在一个属性上带有 JAXB 注释的类。然后我们有几个子类来注释其余的重要数据。然而,我们有一个子类,我们想忽略父类注释,这样它就不会被编组。这是一些示例代码。

父类:

@XmlType(name="Request")
@XmlAccessorType(XmlAccessorType.NONE)
public abstract class Request {
    @XmlElement(required=true)
    private UUID uuid;

    ... setter/getter
}

现在对于子类:

@Xsd(name="concreteRequest")
@XmlRootElement("ConcreteRequest")
@XmlType(name="ConcreteRequest")
@XmlAccessorType(XmlAccessorType.FIELD)
public class ConcreteClass {
    @XmlElement(required=true)
    private String data1;
    @XmlElement(required=true)
    private String data1;

    ... setters/getters ...
}

当我 masrhall 一个 ConcreteClass 的实例时,我得到以下 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConcreteRequest>
    <uuid>uuid</uuid>
    <data1>data</data1>
    <data2>data</data3>
</ConcreteRequest>

我想要这样的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConcreteRequest>
    <data1>data</data1>
    <data2>data</data3>
</ConcreteRequest>

我们有其他的 Request 实现,但是确实需要 UUID,这只是一个特例。有没有办法忽略我的 ConcreteRequest 中的 UUID 字段?

4

2 回答 2

8

我希望,我理解你的问题。这是解决方案。

JAXB 提供@XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc)在编组期间忽略任何字段。

将派生类 (ConcreteRequest.class) 中的“uuid”字段及其对应的 Getter/Setter 方法重写为@XmlTransient。还需要重写 Getter/Setter 方法,这些方法将在编组期间调用。

@Xsd(name="concreteRequest")
@XmlRootElement("ConcreteRequest")
@XmlType(name="ConcreteRequest")
@XmlAccessorType(XmlAccessorType.FIELD)
public class ConcreteClass {
    @XmlElement(required=true)
    private String data1;
    @XmlElement(required=true)
    private String data2;
    @XmlTransient
    private UUID uuid;

    ... setters/getters ...
}

这将覆盖您的基类属性。

回复我以获取更多信息。

于 2012-10-01T13:01:40.647 回答
0

您可以使用

@XmlAccessorType(XmlAccessType.NONE)

在父类上,和

@XmlAccessorType(XmlAccessType.FIELD)

在派生类上。

于 2015-10-28T10:37:42.593 回答