Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于继承的Java到XML注释_Java_Xml_Inheritance_Jaxb - Fatal编程技术网

用于继承的Java到XML注释

用于继承的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;

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

我有两个类具有相同的继承。我的主要课程是材料,然后我有材料类型A,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;
    ...
@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
    注释进行例外)


默认情况下,JAXB实现在处理元数据时不会引入类子类。您可以在创建
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