如何在子类上使用JAXB @XmlValue?

时间:2011-11-11 18:23:43

标签: jaxb

我想要这样的XML:

<simple>Foo</simple>

我可以通过看起来像这样的JAXB类成功地完成这个:

@XmlRootElement(name="simple")
class Simple {
    @XmlValue
    public String contents;
}

但是现在我需要让Simple类成为另一个类的子类,如下所示:

@XmlRootElement(name="simple")
class Simple extends OtherClass {
    @XmlValue
    public String contents;
}

失败了@XmlValue is not allowed on a class that derives another class.我无法轻易地重构超类(因为我们在包装类上使用@XmlElementRef的方式)。有没有一种解决方法可以让我注释我的子类来生成那个简单的XML?

4 个答案:

答案 0 :(得分:12)

接受的答案对我不起作用。

所描述的一切都很好,但我还需要将@XmlTransient添加到超类

答案 1 :(得分:7)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。

MOXy支持此用例,JHOB RI也应支持IMHO:

<强>简单

此类的字段映射为@XmlValue并扩展OtherClass

package forum809827;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement(name="simple")
class Simple extends OtherClass {

    @XmlValue
    // @XmlValueExtension
    // As of moxy 2.6, XmlValueExtension needs to be added for this to work
    public String contents;

}

<强> OtherClass

这是超级课程。在MOXy中,只要超类没有与XML元素的任何映射,子类就可以使用@XmlValue映射字段/属性:

package forum809827;

import javax.xml.bind.annotation.XmlAttribute;

public class OtherClass {

    @XmlAttribute
    public String other;

}

<强>演示

package forum809827;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Simple.class);

        Simple simple = new Simple();
        simple.contents = "FOO";
        simple.other = "BAR";

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(simple, System.out);
    }

}

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<simple xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" other="BAR">FOO</simple>

有关将MOXy指定为JAXB提供程序的更多信息

答案 2 :(得分:0)

我可以通过将@XmlValue更改为@XmlMixed并将变量更改为列表来完成此工作。生成的类应如下所示。

@XmlRootElement(name="simple")
class Simple extends OtherClass {
    @XmlMixed
    public List<String> contents;
}

答案 3 :(得分:0)

这个问题发生在我身上,花了我一点时间。 感谢Blaise Doughan 我浏览他的博客并找到答案

  1. 你必须添加一个 带有javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory的jaxb.properties文件 在同一个包中以便使用MOXy

  2. 将moxy添加到您的maven依赖项或添加moxy jar

    <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>2.5.0</version> </dependency>

  3. 然后全部设定 我在这里有样品你可以通过我的项目去看看 https://github.com/cicidi/HelloCCD/tree/master/Jaxb