2012-10-11 86 views
2

当我从以下模式生成代码时,会创建两个类,即AB。但是,这两个类不被@XmlRootElement注解,所以我得到一个错误,当我尝试元帅B.JAXB不使用XmlRootElement注释

的实例

我看着在网络上,我使用自定义绑定(<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> 

感谢

+2

以下应该有所帮助:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html –

回答

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

我不认为这会产生@XmlRootElement。你确定? (请参阅我的回答。) – Puce

+0

我不确定,但您和我的答案有什么区别? – CAMOBAP

+0

您的complexType B是顶级的,可以重复使用。在我的答案中,没有complexType B,只是具有匿名complexType的顶级元素B. – Puce

1

这是正确的,因为你的架构不声明任何根元素,只有类型。如果你想你的元帅@XmlType -annotated类的一个实例,你需要来包装例如在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来使用相同的技巧,但您可能更适合修改架构,如其他答案中的建议。

+0

也许这理论上可行,但我猜如果你的XSD中没有根元素,生成的文档将不会被验证。 – Puce

+0

感谢您的回答。我总是看到这个代码片段(即与编组),但我不怎么应该得到一个编组实例?此外,我的方法必须返回一个B的实例,我没有看到你的例子。 –

+0

@MickaelMarrache你想_marshal_(从B的一个实例开始,结束了一些XML)或_unmarshal_(以XML开始并以B的一个实例结束)。如果是后者,请用一个XML示例编辑您的问题,您必须从头开始。 –

1

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

例如,像(未经测试):

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