【问题标题】:How to ignore JAXB annotated properties in a parent class?如何忽略父类中的 JAXB 注释属性?
【发布时间】:2012-10-01 11:52:32
【问题描述】:

我们有一个在一个属性上带有 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 字段?

【问题讨论】:

    标签: jaxb marshalling


    【解决方案1】:

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

    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 ...
    }
    

    这将覆盖您的基类属性。

    联系我了解更多信息。

    【讨论】:

    • 不幸的是,我认为这在我的情况下是不可能的。 UUID 字段持久存在于我们的数据库中,因此覆盖它会很危险。基本上我的类是一个特殊的子类,它有一个 UUID 但它不属于 XML 模式。
    • 根据我的分析,JAXB 没有为您的要求提供合适的选项,我建议使用 JAXB 行为 - “当 @XmlElement(nillable=false) 时将忽略 Null 值元素”。这样,在编组时将值“uuid”显式设置为空,这样它就不会在编组期间构造属性。我有一段示例代码,但无法在此处分享。
    【解决方案2】:

    你可以使用

    @XmlAccessorType(XmlAccessType.NONE)
    

    在父类上,并且

    @XmlAccessorType(XmlAccessType.FIELD)
    

    关于派生类。

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 2021-05-11
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      相关资源
      最近更新 更多