2015-09-15 59 views
0

我想將一些SOAP錯誤添加到我的JAX-WS Web服務中,但我不想更改WSDL模式的內容。據我所知,我將不得不使用annotation @WebFault來定義SOAP Fault,並在下一次構建時自動導致WSDL中的更改。有沒有辦法在不更改WSDL方案內容的情況下使用SOAP Faults?在不更改WSDL文件的情況下添加soap故障?

回答

2

當您從您的代碼中拋出異常時,它將在響應中由JAX-WS自動映射到SOAP錯誤。沒有必要在WSDL中定義錯誤。

使用@WebFault或在WSDL文件中定義<soap:fault>元素用於聲明特定操作可能會返回自定義SOAP錯誤。

@WebFault肯定會在生成的WSDL中添加一個<soap:fault>元素。

回顧一下,拋出異常會在肥皂響應中插入一個元素。

更新

定製faultstring:

,你作爲參數傳遞給Exception構造函數的字符串消息表示在<soap:fault>的faultstring元素。例如:在SOAP響應

throw new Exception("This is the faultstring text"); 

由此造成的故障:

<soap:fault> 
    <faultcode>soap:Server</faultcode> 
    <faultstring>This is the faultstring text</faultstring> 
</soap:fault> 

自定義的faultcode:

我不認爲你可以改變正常的Java異常在faultcode。如果您確實需要這樣做,您可以查看JAX-WS SOAPFaultException

請記住,故障碼用於指示產生的錯誤類型,並且大多數時候您將從Web服務返回服務器故障。

這是SOAP 1.1和1.2的四個現有的故障代碼:

  • VersionMismatch:發現SOAP Envelope元素的無效命名空間。
  • 必須瞭解:Heading元素的直接子元素(其mustUnderstand屬性設置爲「1」)不被理解。
  • 客戶端:郵件格式不正確或包含不正確的信息。
  • 服務器:服務器出現問題,消息無法繼續處理。

前三打算解析SOAP請求時,除非有一個非常具體的情況,或者你正在編寫自己的JAX-WS處理程序/攔截器,你將不再需要返回任何其他要通過JAX-WS創建「服務器」以外的錯誤代碼。

定製細節:

<detail>元件將與表示所述異常的元素來填充。因爲如果你扔一個new MyCustomException("custom message")例如,它會是這樣的:

<detail> 
    <MyCustomException> 
     <message>custom message</message> 
    </MyCustomException> 
</detail> 
+0

好吧,但是如果我想更改faultcode和faultstring呢? – ctomek

+0

我更新了答案。您可以使用java Exceptions自定義faultstring,但不能使用faultcode。 –

+0

如果我拋出檢查的異常,那麼我必須通過添加「throws」子句來更改我的webmethod的簽名,因此我將不得不更改我的web方法的接口,以便不會在Web服務中做大的更改就拋出檢查的異常接口。正如我發現的那樣,我必須拋出未經檢查的異常。但是當我拋出RuntimeException它仍然不能按預期工作時,我拋出未經檢查的異常「拋出新的RuntimeException(」test「);」而faultstring是「內部錯誤」而不是「測試」。有任何想法嗎? – ctomek

0

使用SOAP UI測試您的Web服務。我只是在異常中使用自定義消息進行了測試,當我看到Soap Ui的響應時,我看到Fault String具有我的自定義消息。

相關問題