2012-09-20 54 views
23

我使用Apache CXFcxf-codegen-pluginMaven插件生成從WSDL文件源。問題是我得到JAXBElement<String>而不是String。我已經添加了jaxb-bindings.xml文件,該文件是這樣的:JAXB生成的JAXBElement <String>而不是字符串

<jaxb:bindings version="2.1" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:globalBindings generateElementProperty="false"/> 
</jaxb:bindings> 

這應該防止JAXB產生JAXBElement<String>。但它不起作用,我仍然生成JAXBElement<String>而不是String

Maven插件看起來是這樣的:

<plugin> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-codegen-plugin</artifactId> 
    <version>${cxf.runtime.version}</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.cxf</groupId> 
      <artifactId>cxf-rt-bindings-soap</artifactId> 
      <version>${cxf.runtime.version}</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <id>generate-jaxb</id> 
      <phase>generate-sources</phase> 
      <configuration> 
       <additionalJvmArgs>-Dfile.encoding=UTF8</additionalJvmArgs> 
       <wsdlOptions> 
        <wsdlOption> 
         <wsdl>src/main/resources/wsdl/Cubiks.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxb-bindings.xml</extraarg> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxws-bindings.xml</extraarg> 
          <extraarg>-exsh</extraarg> 
          <extraarg>true</extraarg> 
          <extraarg>-wsdlLocation</extraarg> 
          <extraarg></extraarg> 
         </extraargs> 
        </wsdlOption> 
        <wsdlOption> 
         <wsdl>src/main/resources/wsdl/CubiksCallBackService.wsdl</wsdl> 
         <extraargs> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxws-bindings.xml</extraarg> 
          <extraarg>-b</extraarg> 
          <extraarg>${basedir}/jaxb-bindings.xml</extraarg> 
          <extraarg>-exsh</extraarg> 
          <extraarg>true</extraarg> 
          <extraarg>-p</extraarg> 
          <extraarg>com.cubiks.ws.callback</extraarg> 
          <extraarg>-wsdlLocation</extraarg> 
          <extraarg></extraarg> 
         </extraargs> 
        </wsdlOption> 
       </wsdlOptions> 
      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

CXF版本2.6.0。有人知道哪裏可能是問題嗎?

編輯

的XSD是非常巨大的。這是產生JAXBElement<String>

<xs:complexType name="ServiceResponse"> 
    <xs:sequence> 
     <xs:element minOccurs="0" name="RequestStatus" type="tns:RequestStatus"/> 
     <xs:element minOccurs="0" name="RequestStatusDescription" nillable="true" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
    <xs:element name="ServiceResponse" nillable="true" type="tns:ServiceResponse"/> 

的元素和生成的源代碼是:

@XmlElementRef(name = "RequestStatusDescription", namespace = "http://www.cubiksonline.com/2009/08/AssessmentProvider", type = JAXBElement.class) 
protected JAXBElement<String> requestStatusDescription; 
+1

Plz提供了wsdl文件,如果有,xsd – popfalushi

回答

34

我所要做的就是把jaxb:globalBindings換成另一個jaxb:bindings

<jaxb:bindings version="2.0" 
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"> 
    <jaxb:bindings> 
     <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

現在一切正常,沒有生成JAXBElement<String>了。

+1

任何人都可以解釋爲什麼這個工程? –

+0

很高興在JDeveloper中報告此解決方案。只需創建一個xml文件,然後在指定WSDL的URL /位置的階段將其傳遞給嚮導。 – webuster

+0

這也適用於NetBeans 8.2。右鍵單擊該服務並「編輯Web服務屬性」。然後轉到「WSDL自定義」選項卡,並在「外部綁定文件」下的底部添加此文件並重新生成。所有字符串都以String形式解析。坦克! – Darrelk

4

我想你想你的JAXB binding.xml補充:

<jaxb:bindings ... xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"> 
    <jaxb:globalBindings generateElementProperty="false"> 
     <xjc:simple /> 
     <!-- ... --> 
    </jaxb:globalBindings> 
</jaxb:bindings> 
+0

我正在嘗試添加它,但我得到:com.sun.istack.SAXParseException2:「xjc:simple」自定義與任何模式元素都沒有關聯。 –

+0

我已經正確設置了,但仍然一樣。生成JAXBElement 。 –

+2

對,我現在已經簽出了一個WS來測試,這是'generateElementProperty =「false」'屬性,它避免了我的情況下的'JAXBElement'包裝。對不起,噪音。 –

8

你可以我們不能一起嘮叨,一起微笑。刪除minoccurs因爲它無論如何對字符串沒有意義。

+0

爲什麼我不能把它們放在一起?順便說一句,wsdl文件是由客戶端提供的,我們並沒有創建它。我明白他們沒有意義,但它不適用於我決定刪除它們。 –

+5

如果模式都有,那麼您需要一個JAXBElement來區分XML元素丟失(由minOccurs允許)和存在的位置,而不是xsi:nil。如果模式只允許一個或另一個,那麼你不需要JAXBElement作爲'null'屬性值就足夠了。 –

+3

[這篇文章](http://cxf.547215.n5.nabble.com/JAXBElement-in-generated-java-classes-tp4933735p4934002.html)很好地解釋了它。 –

相關問題