2011-11-30 128 views
1

我正在解组符合以下模式的消息,并希望返回的根元素为Bar类。相反,返回的根元素始终是包含名称'foo'的JAXBElement,其值等于所需的Bar元素。在JAXB中使用XmlRootElement以避免根JAXBElement

我认为XmlRootElement可以用来在绑定文件中做到这一点,但还没有得到它的工作。有任何想法吗?

<xsd:element name="foo" type="Bar"/> 
<xsd:complexType name="Bar"> 
    <xsd:sequence> 
     <xsd:element name="goo" type="xsd:string"/> 
    </xsd:sequence> 
</xsd:complexType> 
+0

谢谢,我应该补充说,尽管如此,我无法更改模式。事实上,这是一个简化的例子,在现实生活中,Bar是从另一个模式导入的。 – EwanB

回答

1

因为有可能是对应于一个全球性的复杂类型许多全球性的元素,一个JAXB IMPL不会产生这些类的@XmlRootElement注解。您可以使用匿名复杂类型声明该元素。

<xsd:element name="foo"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="goo" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

unmarshal方法返回的JAXBElement一个实例可以通过调用getValue()获得的域对象。

+0

谢谢布莱斯,这个工程,但我正在寻找一个解决方案,而不改变架构。可能吗? – EwanB

+0

@EwanB - 以下内容可能有所帮助:http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html –

1

您可以使用jaxb:class自定义您的xsd:element,这会为您的元素生成额外的类。这种定制可以通过绑定完成:

<jaxb:bindings node="xsd:element[@name='foo']"> 
    <jaxb:class> 
</jaxb:bindings>