Java JAXB没有';t使用XmlRootElement进行注释

Java JAXB没有';t使用XmlRootElement进行注释,java,jaxb,Java,Jaxb,当我从下面的模式生成代码时,会创建两个类,A和B。但是,这两个类没有被@XmlRootElement注释,所以当我试图封送一个B的实例时,我得到了一个错误 我在网上看过,我尝试过使用自定义绑定()的解决方案,但它不起作用。似乎必须在模式中定义类型为B的元素,才能使此解决方案工作 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns:ns="com:mycomp:service" xmlns="http://www.w3.org

当我从下面的模式生成代码时,会创建两个类,
A
B
。但是,这两个类没有被
@XmlRootElement
注释,所以当我试图封送一个B的实例时,我得到了一个错误

我在网上看过,我尝试过使用自定义绑定(
)的解决方案,但它不起作用。似乎必须在模式中定义类型为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>

谢谢

您需要将
标记添加到您的架构中

<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>

这是正确的,因为您的模式没有声明任何根元素,只声明类型。如果要封送一个
@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);
//从包含生成的类的包名创建上下文
JAXBContext ctx=JAXBContext.newInstance(“com.mycop.service”);
Marshaller=ctx.createMarshaller();
marshaller.marshall(新的JAXBElement(新的QName(“com:mycop:service”,“someB”),
B.class,instanceOfB),outputStream);
这将产生类似于

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

福
酒吧
巴兹

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

XJC只会生成@XmlRootElement,前提是所讨论的顶级元素(通常是单个根元素)的类型他是匿名的

有点像(未经测试):



我认为这不会生成@XmlRootElement。你确定吗?(见我的答案。)我不确定,但你的答案和我的答案有什么区别?你的complexType B是顶级的,可以重复使用。在我的回答中,没有complexType B,只有一个带有匿名complexType的顶级元素B。我无法为每个复杂类型添加元素,因为我的模式是我在服务中使用的标准模式。以下内容应该会有所帮助:也许这在理论上可行,但是如果XSD中没有根元素,那么生成的文档将无法验证。谢谢您的回答。我总是看到这段代码片段(即使用封送拆收器),但我不知道如何获得封送拆收器实例?另外,我的方法必须返回一个B实例,我在您的示例中没有看到这一点。@MickelMarrache您想封送(从一个B实例开始,以一些XML结束)还是取消封送(从XML开始,以一个B实例结束)。如果是后者,请用一个XML示例编辑您的问题。我正在REST web服务的上下文中工作。我有一个定义资源B方法的接口。我编写了一个实现这个资源接口的类。例如,此类的GET方法返回XML中B实例的表示形式。当我按原样返回实例时,我得到一个异常,因为该类没有用@XmlRootElement注释。因此,在这个方法中,我只需要编组就可以作为结果返回XML表示。但是,在另一种方法(即PUT)中,我可能需要在请求中提供我的资源的XML表示,即解组。我将编辑我的答案以确保完整性,但在这种情况下,您可能需要修改模式以添加其他答案所建议的一些元素声明。除此之外,它不再是一个纯粹的JAXB问题,因此您可能应该针对适当的框架或API(jax-rs、resteasy等)提出一个单独的问题,其中包括一个服务代码示例,以达到正确的受众。
<element name='B'>
   <complexType>
        <complexContent>
            <extension base="ns:A">
            <sequence>
                <element name="b1" type="string" />
            </sequence>
            </extension>
        </complexContent>
  </complexType>
</element>