2012-10-16 59 views
3

我已發佈此問題here。但沒有得到任何答案。所以我也在這裏發佈。輸入/輸出元素的名稱必須是唯一的(WSDL規格)


我對WSDL有疑問。

我已經有如下兩種方法WSDL:

<portType name="TestService"> 
    <operation name="add"> 
     <input 
      wsam:Action="http://service.psvm.com/testservice/TestService/addRequest" 
      message="tns:add" 
      name="InputNums" /> 
     <output 
      wsam:Action="http://service.psvm.com/testservice/TestService/addResponse" 
      message="tns:addResponse" 
      name="Result" /> 
    </operation> 
    <operation name="subtract"> 
     <input 
      wsam:Action="http://service.psvm.com/testservice/TestService/subtractRequest" 
      message="tns:subtract" 
      name="InputNums" /> 
     <output 
      wsam:Action="http://service.psvm.com/testservice/TestService/subtractResponse" 
      message="tns:subtractResponse" 
      name="Result" /> 
    </operation> 
</portType> 

正如你可以看到,無論是運營加減有輸入名稱相同的「InputNums」和「結果」 &輸出消息分別。

當我試圖驗證此WSDL,我得到以下錯誤:

The name 'InputNums' specified for this input element is not unique. The name of an input element must be unique from the names of all other input and output elements defined in the 'TestService' port type.

我讀過這裏的WSDL規範不給出明確的原因(至少對我來說)。它說:

The name attribute of the input and output elements provides a unique name among all input and output elements within the enclosing port type. In order to avoid having to name each input and output element within an operation, WSDL provides some default values based on the operation name.

爲了避免命名每個輸入/輸出元素,WSDL提供了默認值。但是爲什麼這是一個規則?它不應該是一個警告? 如果他/她想要,開發人員不能提供他/她的名字嗎?

此外,我不明白爲什麼這是一個問題,因爲當客戶端調用Web服務時,它們使用特定的操作名稱調用'add'或'subtract'。 我的問題最後是 - 只要操作名稱不同,爲什麼參數名稱很重要? 有人可以解釋這樣的WSDL的後果嗎?

+0

灰色框中似乎沒有東西。 – rolve

+0

我在編輯它。對不起,出於某種原因,WSDL內容沒有顯示出來。你現在能看到它嗎? –

回答

0

我認爲如果您想描述why not?,可能會有更好的答案。如果你堅持使用默認值,它對你做了什麼?如果你想命名他們,爲什麼不遵守規則?

這並不是說你不太對。實際上,WSDL 2.0完全放棄了這個屬性。所以我猜根據規範的工作人員沒有發現任何基於1.1註釋的實例中的任何證據,表明實際使用此規則;所以本着這種精神,他們已經放棄了它,同時還有屬性。我很確定這些名稱即使使用RPC樣式綁定也沒有用。

我可以明白爲什麼在早期有人會提出這個規則:它與名稱的其餘規則是一致的;我想有人認爲隨後的綁定規範可能會發現這些名稱是獨一無二的。

如果有人會問爲什麼它不在XSD中爲WSDL 1.1強制執行,與其他名稱規則相同,我會回答XSD無法表達此約束(因爲它跨越兩個不同的選擇器)匹配在同一時間)。

我真的認爲這很重要,你爲什麼在乎。我測試過的所有工具(.NET和JAX-WS)並不介意:它們能夠執行合同到代碼的綁定。 WS-I BP 1.x和2.x似乎沒有解決它。所有這些,看到WSDL 2.0都將它放在一起,告訴你,你是對的,它是/無用的。

我也知道不驗證WSDL的工具,比如你的;另一方面,.NET甚至不會吱吱作響。儘管如此,如果你關心的是一個挑剔的實際結果,那麼你只需要堅持規則......或者忽略它。

+0

爲什麼不呢? - 好的,痛苦是:我需要提供具有10個差異方法的Web服務,它們採用相同的一組參數(比如20個變量),做一些計算並返回相同的一組參數,但具有更新的值。現在,我已經將所有這20個變量放入一個POJO中,並接受相同的POJO作爲輸入,並返回所有這10種方法的輸出相同的POJO。我寫的WSDL對所有這些參數使用相同的對象名稱。 WSDLvalidation失敗並帶有唯一名稱約束。如果我爲POJO使用diff.object名稱,那麼我需要有10個diff.objects(或20),這些diff.objects(或20)將具有相同的20個變量。 –

+0

因爲我們正在關注WSDL 1.1和第三方,這些WSDL的客戶端不會接受它,因爲它不符合規範。我必須花一些時間來說服他們。雖然它有一個很好的結局,但如果WSDL規範並沒有這個規則,那麼可以避免這種痛苦:-)注意:我不得不拆分我的註釋,因爲stackoverflow只接受600個字符 –

+0

@MeghanaReddy,I我仍然有點困惑。如果你願意,你能告訴我你在wsdl:input和wsdl:output元素名稱,你的Java和/或電報上的XML之間有什麼關係?我想知道我在這裏錯過了什麼,因爲從我所能告訴的,應該沒有。 –

相關問題