JAXB不使用XmlRootElement进行批注

时间:2012-10-11 21:13:29

标签: java jaxb

当我从以下架构生成代码时,会创建两个类AB。但是,这两个类没有@XmlRootElement注释,所以当我尝试编组B的实例时出现错误。

我在网上看过,我尝试使用自定义绑定(<xjc: simple/>)解决方案,但它不起作用。似乎必须在模式中定义类型B的元素才能使此解决方案起作用。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:ns="com:mycomp:service" xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="com:mycomp:service"
    elementFormDefault="qualified" xml:lang="EN">
    <complexType name="A" abstract="true">
        <sequence>
            <element name="a1" type="string" />
        <element name="a2" type="string" />
        </sequence>
    </complexType>
    <complexType name="B">
        <complexContent>
            <extension base="ns:A">
            <sequence>
                <element name="b1" type="string" />
            </sequence>
        </extension>
        </complexContent>
    </complexType>
</schema>

由于

3 个答案:

答案 0 :(得分:1)

这是正确的,因为您的架构不会声明任何根元素,只会声明类型。如果要编组一个@XmlType - 注释类的实例,则需要将该实例包装在JAXBElement中,以告诉编组器使用哪个元素名称:

// create context from the package name that contains your generated classes
JAXBContext ctx = JAXBContext.newInstance("com.mycomp.service");
Marshaller marshaller = ctx.createMarshaller();
marshaller.marshal(new JAXBElement<B>(new QName("com:mycomp:service", "someB"),
      B.class, instanceOfB), outputStream);

这会产生类似

的东西
<someB xmlns="com.mycomp.service">
  <a1>foo</a1>
  <a2>bar</a2>
  <b1>baz</b1>
</someB>

编辑:您已经评论过您自己没有进行编组,而是返回一个REST框架的对象来代表您进行编组。您可以通过声明您的操作返回JAXBElement<B>而不仅仅是B来使用相同的技巧,但您可能最好根据其他答案中的建议修改架构。

答案 1 :(得分:1)

如果所讨论的top元素的类型(通常是单个根元素)是匿名的,XJC将只生成@XmlRootElement。

EG。像(未经测试的):

<element name='B'>
   <complexType>
        <complexContent>
            <extension base="ns:A">
            <sequence>
                <element name="b1" type="string" />
            </sequence>
            </extension>
        </complexContent>
  </complexType>
</element>

答案 2 :(得分:0)

您需要在架构中添加<element>标记

<schema xmlns:ns="com:mycomp:service" xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="com:mycomp:service"
    elementFormDefault="qualified" xml:lang="EN">
    <complexType name="A" abstract="true">
        <sequence>
            <element name="a1" type="string" />
        <element name="a2" type="string" />
        </sequence>
    </complexType>
    <complexType name="B">
        <complexContent>
            <extension base="ns:A">
                <sequence>
                    <element name="b1" type="string" />
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    <element name="A" type="ns:A"/>
    <element name="B" type="ns:B"/>
</schema>