2014-10-30 101 views
4

背景: 我們正在開發一個與多個第三方Web服務進行通信的應用程序。 不幸的是,其中一個已經使用糟糕的命名約定定義了一個WSDL文件。 相同的名稱通常被重複用於響應元素,以及它使用的complexType。下面剪斷的代碼示出了一個這樣的發生,例如:具有重複名稱的WSDL - 如何強制Java類名稱

<s:element name="Reset_PasswordResponse"> 
    <s:complexType> 
     <s:sequence> 
     <s:element minOccurs="0" maxOccurs="1" name="Reset_PasswordResult" type="tns:ResetPasswordResponse" /> 
     </s:sequence> 
    </s:complexType> 
    </s:element> 
    <s:complexType name="ResetPasswordResponse"> 
    <s:complexContent mixed="false"> 
     <s:extension base="tns:BaseResponse" /> 
    </s:complexContent> 
    </s:complexType> 

我們使用Maven CXF代碼生成插件(JAXB/JAX-WS)來編譯該Java類。爲了避免名稱衝突,我們以前使用的選項-AutoNameResolution。 然而,我們已經發現,這會導致意想不到的結果,其中有些機器上一個 類被重命名爲ResetPasswordResponse2.java,而在其他機器上其他類被重命名。 這使得協作開發非常困難,也給了我們的後顧之憂

問題(如果它不能正確的詹金斯在某些時候編譯): 我正在尋找一種方式來手動確定翻譯/重命名應該如何進行。

  • 我被告知,僅僅更改WSDL中的名稱將不起作用,因爲Java文件中的xml命名註釋非常重要。
  • 我也看着約束力的文件或內聯約束性聲明,但無法得到它的工作。在http://wiki.netbeans.org/WsdlCustomizer#Class_Customization文檔似乎暗示着名稱的變化僅適用於「WSDL:端口類型,WSDL:故障,肥皂:headerfault中,和wsdl:服務器」,這表示我可能會嘗試做一些事情,是根本不可能的。

jaxb/jax-ws是否可以綁定一個可能的解決方案?還有其他選擇嗎?

回答

4

檢查這個問題,答案是:

JAXB Binding for XSD outside WSDL

總之,你可以使用所謂的綁定文件來定製名稱。

<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jxb:bindings schemaLocation="xsdschema.xsd" node="/xs:schema"> 
     <jxb:bindings node="xs:complexType[@name='ResetPasswordResponse']"> 
      <jxb:class name="ResetPasswordResponseType"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

您可以在jaxb:nameXmlTransform感興趣:

Issue with JAXB: nameXmlTransform typeName prefix not working

這將允許你在全球範圍內自定義類型或元素的命名規則:

<?xml version="1.0" encoding="UTF-8"?> 
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0"> 
    <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema"> 
     <jaxb:schemaBindings> 
     <jaxb:nameXmlTransform> 
      <jaxb:typeName suffix="Type"/> 
      <jaxb:elementName suffix="Element"/> 
     </jaxb:nameXmlTransform> 
     </jaxb:schemaBindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

積分去Blaise Doughan

+0

謝謝你,Lexicore。 事實證明,我的主要問題是在我的外部約束力的文件中定義的命名空間/的schemaLocation。我現在已經設法將 綁定文件正確地綁定到wsdl。 您的第一個類名自定義示例鼓勵我再次嘗試讓該解決方案起作用,並且最終結果的確與您的代碼非常相似。 但是,全局重命名的選項也非常有趣,並且可能爲其他人避免了很多麻煩(在他們的wsdl的將來版本中存在更多命名衝突或可能會出現更多命名衝突)。 – Michael 2014-10-30 14:44:30

+0

@Michael很高興幫助。 – lexicore 2014-10-30 16:25:42