基类中的@XMLAnyElement和子类中的@XmlValue

时间:2013-11-21 05:34:47

标签: java xml jaxb

我有一个现有的项目,我必须引入JAXB进行序列化。 我有一个Base类(GrandParent),其中所有必须序列化的类都被扩展。我希望在所有子类中都有一个元素,它将存储在marshal / unmarshal期间找到的任何未知的有效xml。这就是为什么我创建了一个新类(RandomBody),它将存储未知的xml并使其成为基类(GrandParent)的受保护成员变量,以便所有子类将按层次结构包含它。

到目前为止,没关系。当我在任何子类中包含任何@XmlValue属性时,就会出现问题。作为If a class has @XmlElement property, it cannot have @XmlValue property.

我还需要在某些派生类中使用@XmlValue。但是作为@XmlValue is not allowed on a class that derives another class.,我创建了一些中间类并将它们标记为@XmlTransient,然后将它们扩展到我的叶类。

请看下面的结构

public class GrandParent{
    @XmlAnyElement
    protected RandomBody randomXML;
    .............
}

public class RandomBody{
    private String anyUnknownText;
    ..............
}

@XmlTransient
public class Father extends GrandParent{

}

public class Boy extends Father{
   @XmlValue
   private String name;
   //This has automatically included the ability to handle anyUnknownText from RandomBody
   //And thus will marshal/Unmarshall any unknown node 
}
public class Girl extends Father{
   @XmlValue
   private String name;
   //This has automatically included the ability to handle anyUnknownText from RandomBody
   //And thus will marshal/Unmarshall any unknown node 
}

@XmlRootElement
public class Main{
   @XmlElement
   private Boy boy;
   @XmlElement
   private Girl girl;
   @XmlElement
   private String id;
}

所以,我的问题在这里很清楚。我在这段代码中有两个问题:

  1. 我无法在@XmlAnyElement中使用GrandParent,因为这会与我的Boy,Girl发生冲突,导致@XmlvalueIf a class has @XmlElement property, it cannot have @XmlValue property.

  2. 我必须将GrandParent声明为@XmlTransient以避免与Boy,Girl冲突@XmlValue is not allowed on a class that derives another class.

    • 任何人都可以帮助我如何在层次结构的最顶层包含一个变量来处理子类的所有有效的未知xml?
    • 接下来的问题是,当我在Base中使用@XmlAnyElement时,如何在子类中添加@XmlValue属性?
    • 我的要求是否真的可以通过Jaxb处理?

1 个答案:

答案 0 :(得分:0)

我已通过将所有@XmlValue替换为@XmlMixed属性来解决我的问题。 我现在可以在@XmlAnyElement

RandomBody中安全地定义GrandParent