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