2

当我从以下架构生成代码时,会创建两个类,A并且B. 但是,这两个类没有注释@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>

谢谢

4

3 回答 3

1

这是正确的,因为您的架构没有声明任何根元素,只有类型。如果你想编组一个你的@XmlType-annotated 类的实例,你需要将该实例包装在 aJAXBElement中,以便告诉编组器使用什么元素名称:

// 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 框架代表您进行编组。您可以通过将操作声明为 returnJAXBElement<B>而不是 just来使用相同的技巧B,但您最好按照其他答案中的建议修改架构。

于 2012-10-11T22:12:54.397 回答
1

XJC 只会在所讨论的顶部元素(通常是单个根元素)的类型是匿名的情况下生成 @XmlRootElement。

例如。类似(未经测试):

<element name='B'>
   <complexType>
        <complexContent>
            <extension base="ns:A">
            <sequence>
                <element name="b1" type="string" />
            </sequence>
            </extension>
        </complexContent>
  </complexType>
</element>
于 2012-10-11T22:51:11.377 回答
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>
于 2012-10-11T21:17:52.933 回答