我没有发现任何类似的问题,所以我不知道是否可能。
我有几个具有相同继承的类。我的主要课程是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。我不想返回任何属性。如果我为特定类型的材料更改上述方法,它可以工作,但我想要更通用的东西。有可能吗?
提前致谢!
答案 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 {
// ...
}