可以/我应该在"propOrder"注释中列出JAXB映射bean的继承属性吗?

agn*_*nul 15 java jaxb jaxb2

我有一堆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;
}
Run Code Online (Sandbox Code Playgroud)

现在每当我对其中一个进行编组,Foo或者BarIllegalAnnotationException抱怨commonField被列入propOrder课堂但没有出现在课堂上时.从propOrder注释中删除它一切正常,但我知道我应该列出所有映射的字段.我错过了什么?

bdo*_*han 27

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

  • 请注意,这会将子类上的注释与超类的私有实现细节结合起来。随意重构超类中的字段名称,而不手动修改“propOrder”,将破坏子类的序列化。向超类添加序列化字段也是如此。另请注意,“propOrder”中的名称不是 @XmlElement 注解提供的名称,而是 Java 字段或属性的标识符。[也就是说,这个答案今天对我很有帮助。] (2认同)