代码之家  ›  专栏  ›  技术社区  ›  prozaak

如何忽略父类中JAXB注释的属性?

  •  8
  • prozaak  · 技术社区  · 13 年前

    我们有一个类,其中一个属性带有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 ...
    }
    

    当我屏蔽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字段?

    2 回复  |  直到 13 年前
        1
  •  9
  •   omega    13 年前

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

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

    覆盖字段 “uuid” @Xml瞬态 在派生类(ConcreteRequest.class)中,以及相应的Getter/Setter方法。还有必要重写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 ...
    }
    

    这将覆盖基类属性。

    请回复我了解更多信息。

        2
  •  0
  •   Roberto    10 年前

    您可以使用

    @XmlAccessorType(XmlAccessType.NONE)
    

    在父类上,以及

    @XmlAccessorType(XmlAccessType.FIELD)
    

    关于派生类。