用于继承的Java to XML Annotation

时间:2014-08-11 13:10:37

标签: java xml inheritance jaxb

我没有发现任何类似的问题,所以我不知道是否可能。

我有几个具有相同继承的类。我的主要课程是Material,然后是我的MaterialTypeA,B,C ......所有这些课程都有不同的属性。

到现在为止,我的主要课程是这样的。

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public abstract class Material {
    @XmlElement
    private String name;
    private String details;
    ...

其他课程是这样的:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class MaterialTypeA extends Material {
    @XmlElement
    private String propertyA1;
    private String propertyB2;
    ...

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class MaterialTypeB extends Material {
    @XmlElement
    private String propertyB1;
    private String propertyB2;
    ...

我想返回所有材质,但也要返回每种类型的特定属性。所以我做了类似的事情:

public List<Material> teste() {
    List<Material> materials = business.findAll();
    return materials;
}

我的结果是所有材料,但只返回了名称和ID。我不想返回任何属性。如果我为特定类型的材料更改上述方法,它可以工作,但我想要更通用的东西。有可能吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

您在课程中使用了@XmlAccessorType(XmlAccessType.NONE),因此默认情况下您的字段不会被序列化/反序列化。

或者:

  • 您必须使用@XmlElement注释所有属性,而不仅仅是name

  • 或者使用@XmlAccessorType(XmlAccessType.FIELD),然后您不必为字段添加注释(但您仍然可以使用@XmlTransient注释进行例外处理。)

答案 1 :(得分:2)

默认情况下,JAXB实现在处理元数据时不会引入类子类。您可以在创建JAXBContext时包含子类,但通常只需在超类中使用@XmlSeeAlso注释指向要包含的子类。

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@XmlSeeAlso({MaterialTypeA.class, MaterialTypeB.class})
public abstract class Material {

答案 2 :(得分:1)

这是包含材料“混合列表”的类的模板:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "StoreType", propOrder = {
    "mataOrMatb"
})
public class StoreType {

@XmlElements({
    @XmlElement(name = "mata", type = MaterialA.class),
    @XmlElement(name = "matb", type = MaterialB.class)
})
protected List<Material> mataOrMatb;

public List<Material> getMataOrMatb() {
    if (mataOrMatb == null) {
        mataOrMatb = new ArrayList<Material>();
    }
    return this.mataOrMatb;
}

}

您可以愉快地将MaterialA和MaterialB对象插入到列表中,并且编组可以为您提供:

<store>
  <mata>
    <name>mata</name
    <propertyA1>propa1</propertyA1>
  </mata>
  <matb>
    <name>matb</name>
    <propertyB1>propb1</propertyB1>
  </matb>
  <mata>
    <name>mata1</name>
    <propertyA1>propa1-1</propertyA1>
  </mata>
</store>

上下文应该包含目录(包含“store”类和Material及其子类的目录。

类材料应该像这样开始:

@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Material", propOrder = {
    "name"
})
@XmlSeeAlso({
    MaterialB.class,
    MaterialA.class
})
public class Material {
    // ...
}