2013-04-30 17 views
1

我在輸出消息中的選擇上下文中有關於Webservice接口的向後兼容性的問題。無法真正找到答案。在xsd選項擴展的情況下向後兼容Webservice操作輸出消息

我們假設我有一個帶有「getData」操作的Webservice,它有以下響應消息(這是Web服務的V1)。響應消息包含一個選擇元素,它返回「指令」或「密鑰翻譯」的有效負載。這個V1 WSDL被各種消費者使用,這些消費者生成java綁定並在生產環境中生成應用程序。

<xsd:complexType name="GetInstructionListResponse"> 
    <xsd:sequence> 
     <xsd:element name="ContinueInfo" type="tns:ContinueInfo" form="qualified" /> 
     <xsd:element name="ResultLength" type="xsd:integer" form="qualified" /> 
     <xsd:element name="Payload"> 
      <xsd:complexType> 
      <xsd:choice> 
       <xsd:element name="DataObjectList1" type="tns:Instruction" form="qualified" minOccurs="1" maxOccurs="50" /> 
       <xsd:element name="DataObjectList2" type="tns:KeyTranslation" form="qualified" minOccurs="1" maxOccurs="50" /> 
      </xsd:choice> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="ReturnCodeList" type="tns:ReturnCodeList" form="qualified" minOccurs="0"> 
      <xsd:annotation> 
       <xsd:documentation>Description: List of error descriptions</xsd:documentation> 
      </xsd:annotation> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

作爲此接口的提供者,我們現在將在V1的推出後引入第三個選擇元素「Advise」。

<xsd:complexType name="GetInstructionListResponse"> 
    <xsd:sequence> 
     <xsd:element name="ContinueInfo" type="tns:ContinueInfo" form="qualified" /> 
     <xsd:element name="ResultLength" type="xsd:integer" form="qualified" /> 
     <xsd:element name="Payload"> 
      <xsd:complexType> 
      <xsd:choice> 
       <xsd:element name="DataObjectList1" type="tns:Instruction" form="qualified" minOccurs="1" maxOccurs="50" /> 
       <xsd:element name="DataObjectList2" type="tns:KeyTranslation" form="qualified" minOccurs="1" maxOccurs="50" /> 
       <xsd:element name="DataObjectList2" type="tns:Advice" form="qualified" minOccurs="1" maxOccurs="50" /> 
      </xsd:choice> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="ReturnCodeList" type="tns:ReturnCodeList" form="qualified" minOccurs="0"> 
      <xsd:annotation> 
       <xsd:documentation>Description: List of error descriptions</xsd:documentation> 
      </xsd:annotation> 
     </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

問題是現在,這種變化在輸出消息重大更改,即沒有一個現有的消費者(與V1的工作,它不需要新的選擇元件)具有:做任何事情(如再生java綁定,任何編組問題?),以防萬一我們用這個擴展的響應結構將V1 WSDL提供者接口替換爲提供者,或者只要他不需要處理中的第三個選擇元素,它就對他來說是透明的?

+0

選擇不是那種可擴展的;作爲示例,沒有定製綁定文件的JAXB版本將根據選擇的內容創建時髦的命名get/set選項。所以問題可能在於,即使接受更改並重新創建代碼(使用xjc),您也會得到破壞代碼的類(除非使用自定義綁定)。你使用枚舉的方法是正確的。另一種達到相同的機制,就默認綁定而言更好,是考慮替代組而不是選擇。 – 2013-05-01 13:53:29

+0

thx爲答案和附加點。考慮到替代組我會檢查出來。我必須補充一點,web服務外觀由基於ibm zos cobol的服務實現支持。目前的wsdl2cobol編譯器在其wsdl功能豐富性方面有所限制。從部署的角度來看,我們的消費者將在編譯時使用wsdl,而不是運行時。任何新的編譯和部署都將包含兩個獨立測試環境階段的傳遞。 – talfco 2013-05-02 19:15:41

+0

只是好奇,是由於REDEFINES的這個選擇? – 2013-05-02 19:23:03

回答

0

在此期間,我建立一個測試平臺(Eclipse中,ApacheV6,Axis2的),並運行一個測試:

  • 有一個客戶端使用服務器的V1的WSDL Java綁定這是(二選元素)
  • 使服務器運行WSDL V2實現有三種選擇。
  • 結果:Java客戶端仍然可以連接並從V2服務器返回兩個選擇元素的正確結果(無需編組問題,無需重新編譯)。
+1

第三個選擇發生了什麼? – 2013-05-01 01:20:23

+1

我必須在這裏更具體: 帶有V1接口的Web服務使用者/客戶端將作爲輸入參數傳入,以使他或者希望存儲在_choice元素1_或_choice元素2_中的數據。對der V2提供者接口執行的兩個請求都將返回_choice元素1_或_choice元素2_。因此,服務器邏輯V1不會改變服務器邏輯,現在(對於V2的消費者客戶端)傳回_choice元素3_(如果這樣的客戶端在其輸入請求中傳遞此信息)。所以_choice元素3_對V1接口使用者是透明的。 – talfco 2013-05-01 12:30:48

1

由嚴格的定義,我會稱這是一個突破性的變化。通過「嚴格」,我的意思是可以編寫一個在更改之前工作的程序,並在更改之後再打破。任何在改變之前都會收到兩個原始選擇中的一個的程序,但現在將獲得第三選擇 - 該程序將被打破。

此外,任何可以讀取WSDL的程序都會看到它發生了變化。如果WSDL發生變化,則可以合理地允許這樣的程序「中斷」。請注意,在Visual Studio中使用類似wsdl2java或「Add Service Reference」的工具時,正在從WSDL編寫代碼。 WSDL中的更改將導致生成的代碼發生更改。不要輕視你可能會在不知情的情況下改變某人的代碼。

+1

嗨,約翰thx的答案。嚴格的定義你是對的。 在我的真實情況下,消費者必須將輸入參數傳遞給操作(枚舉),在該操作中他必須告訴他要獲取哪個選擇元素。這意味着這樣的消費者永遠不會意識到並且永遠不會回到第三個選擇元素,因爲在它的java綁定中,選擇元素枚舉選擇器只允許選擇V1選擇元素。如果他想要請求第三個選擇元素,他必須包含擴展的WSDL(wsdl2java等)並執行代碼更改。 – talfco 2013-05-01 12:40:06

相關問題