【问题标题】:Can/Should I list inherited properties for a JAXB mapped bean in the "propOrder" annotation?我可以/应该在“propOrder”注释中列出 JAXB 映射 bean 的继承属性吗?
【发布时间】:2011-07-22 12:41:56
【问题描述】:

我有一堆 JAXB 注释类,它们有一个共同的字段,所以我把那个字段移到了一个超类中,就像这样

public class Base {
    protected SomeType commonField;
}

@XmlRootElement(name = "foo") @XmlType(propOrder = { "commonField", "fooField" })
public class Foo extends Base {
    private SomeOtherType fooField;
}

@XmlRootElement(name = "bar") @XmlType(propOrder = { "commonField", "barField" })
public class Bar extends Base {
    private SomeOtherType barField;
}

现在,每当我编组Foo 或Bar 之一时,我都会收到IllegalAnnotationException 抱怨commonField 被列在propOrder 中但不在课堂上。从propOrder 注释中删除它一切正常,但我认为我应该列出所有映射的字段。我错过了什么?

【问题讨论】:

    标签: java jaxb jaxb2


    【解决方案1】:

    继承类的字段/属性将始终出现在子类的字段/属性之前。这意味着默认情况下您不能在子类型上的propOrder 中指定它们。但是,如果您将父类标记为 @XmlTransient,则字段/属性将被视为属于子类,并且可以包含在 propOrder 中。

    【讨论】:

    • 请注意,这会将子类上的注释与超类的私有实现细节结合起来。在超类中随便重构一个字段名,而不手动修改propOrder,会破坏子类的序列化。向超类添加序列化字段也是如此。另外,请注意propOrder 中的名称不是@XmlElement 注解提供的名称,而是Java 字段或属性的标识符。 [也就是说,今天这个答案对我很有帮助。]
    • 如果 Base 可以被序列化并且 Foo 和 bar 也可以呢?
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多