2011-11-30 131 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>