用于继承的Java到XML注释
我没有发现任何类似的问题,所以我不知道这是否可能 我有两个类具有相同的继承。我的主要课程是材料,然后我有材料类型A,B,C。。。所有这些类都有不同的属性 到目前为止,我的主要课程是这样的用于继承的Java到XML注释,java,xml,inheritance,jaxb,Java,Xml,Inheritance,Jaxb,我没有发现任何类似的问题,所以我不知道这是否可能 我有两个类具有相同的继承。我的主要课程是材料,然后我有材料类型A,B,C。。。所有这些类都有不同的属性 到目前为止,我的主要课程是这样的 @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) public abstract class Material { @XmlElement private String name; private String details;
@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;
...
@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Material", propOrder = {
"name"
})
@XmlSeeAlso({
MaterialB.class,
MaterialA.class
})
public class Material {
// ...
}
我想返回我的所有材料,但也要返回每种类型的特定属性。所以我在做这样的事情:
public List<Material> teste() {
List<Material> materials = business.findAll();
return materials;
}
公共列表teste(){
列出物料=business.findAll();
归还材料;
}
我的结果是所有材料,但只是返回了名称和id。没有返回我想要的属性。如果我为特定类型的材料更改上述方法,它可以工作,但我希望使用更通用的方法。可能吗
提前谢谢 您在类上使用了
@xmlacessortype(xmlacesstype.NONE)
,因此默认情况下,您的字段不会被序列化/反序列化
要么:
- 您必须使用
注释所有属性,而不仅仅是@xmlement
名称
- 或者使用
,这样就不必对字段进行注释(但仍然可以对@xmlacessortype(xmlacesstype.FIELD)
注释进行例外)@xmltransive
@xmlacessortype(xmlacesstype.NONE)
,因此默认情况下,您的字段不会被序列化/反序列化
要么:
- 您必须使用
注释所有属性,而不仅仅是@xmlement
名称
- 或者使用
,这样就不必对字段进行注释(但仍然可以对@xmlacessortype(xmlacesstype.FIELD)
注释进行例外)@xmltransive
JAXBContext
时包含子类,但通常只需利用超类中指向要包含的子类的@xmlseea
注释即可
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@XmlSeeAlso({MaterialTypeA.class, MaterialTypeB.class})
public abstract class Material {
默认情况下,JAXB实现在处理元数据时不会引入类子类。您可以在创建
JAXBContext
时包含子类,但通常只需利用超类中指向要包含的子类的@xmlseea
注释即可
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
@XmlSeeAlso({MaterialTypeA.class, MaterialTypeB.class})
public abstract class Material {
这是包含材料“混合列表”的类的模板:
@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;
}
}
这是包含材料“混合列表”的类的模板:
@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;
}
}
您必须使用
@xmlement
注释所有属性,而不仅仅是名称
。或者使用@xmlacessortype(xmlacesstype.FIELD)
,然后您就不必对字段进行注释(但仍然可以对@xmltransive
注释进行例外)。正如@icza所说,因为您使用了xmlacesstype.NONE。@icza我想要的所有字段都进行了注释。名称、PropertyA1和PropertyB1。我不需要其他的。这就是我使用@xmlacessortype(xmlacesstype.NONE)的原因。您必须使用@xmlement
注释所有属性,而不仅仅是名称。或者使用@xmlacessortype(xmlacesstype.FIELD)
,然后您就不必对字段进行注释(但仍然可以对@xmltransive
注释进行例外)。正如@icza所说,因为您使用了xmlacesstype.NONE。@icza我想要的所有字段都进行了注释。名称、PropertyA1和PropertyB1。我不需要其他的。这就是为什么我要使用@XmlAccessorType(XmlAccessType.NONE)。正如我在前面的评论中所说的那样。@icza你没有解决真正的问题。正如我在前面的评论中所说的那样。@icza你没有解决真正的问题。@XmlSee也解决了问题,但正如laune首先回答的那样,我认为这是正确的答案。不过还是要谢谢你@kneves.vinicius——公平地说,根据我在laune之前4小时回答的时间戳:)嗯,使用@xmlsee也可能有帮助,但它对于创建由不同子类的对象组成的列表不是必需的。此注释确实扩展了创建JAXBContext的范围,但是如果JAXBContext.newInstance调用中的包路径或类列表已经包含这些类,则可以忽略它。由于看不到包含列表的类以及封送拆收器是如何创建的,我无法说出最初问题的真正原因。@laune-取决于您希望如何处理继承。如果JAXB知道所有类,它将利用xsi:type
属性来指定适当的子类型(请参阅:)@xmlements
通常用于表示选择(请参阅:)。如果想要一个元素名作为继承指示符(替换组),那么您也可以使用@xmlementref
/@xmlementrefs
(请参见:)。@xmlsee也解决了这个问题,但正如laune首先回答的那样,我接受它作为正确答案。不过还是要谢谢你@kneves.vinicius——公平地说,根据我在laune之前4小时回答的时间戳:)嗯,使用@xmlsee也可能有帮助,但它对于创建由不同子类的对象组成的列表不是必需的。此注释确实扩展了创建JAXBContext的范围,但是如果JAXBContext.newInstance调用中的包路径或类列表已经包含这些类,则可以忽略它。由于看不到包含列表的类以及封送拆收器是如何创建的,我无法说出最初问题的真正原因。@laune-取决于您希望如何处理继承。如果JAXB知道所有类,它将利用xsi:type
属性来指定适当的子类型(请参阅:)@xmlements
通常用于表示选择(请参阅:)。如果需要元素名作为继承指示符(替换组),那么还可以使用@xmlementref
/@xmlementr