2016-02-29 41 views
2

我試圖實現自定義SOAP錯誤象下面這樣:自定義SOAP錯誤

@SoapFault(faultCode = FaultCode.CUSTOM, customFaultCode="{namespace}Server Error", faultStringOrReason="Error encountered when processing request message.") 
public class SystemFault extends BusinessException{ }. 

拋出SOAP錯誤是以下格式:

<.SOAP-ENV:Fault> 
    <.faultcode xmlns:ns0="namespace">ns0:star:Server Error<./faultcode> 
    <.faultstring xml:lang="en">Error Encountered when processing the request.<./faultstring> 
<./SOAP-ENV:Fault> 

,你可以請參閱錯誤代碼標籤出現在名稱空間聲明中。請讓我知道是否有任何迴避。 SOAP錯誤客戶端的格式期待是:

<.soapenv:Fault xmlns:star="http://www.starstandard.org/STAR/5"> 
    <.faultcode>star:Custom Fault Code<./faultcode> 
    <.faultstring>Custom Fault message<./faultstring> 
<./soapenv:Fault> 

我經過AbstractSoapFaultDefinitionExceptionResolver.resolveExceptionInternal()方法,它期待的故障代碼,而不是一個字符串QName實例。請讓我知道如何解決這個問題。

回答

0

看起來像你幾乎在那裏與你的customFaultCode語法!

讓我們修改該JavaDoc的一次:

/** 
* The custom fault code, to be used if {@link #faultCode()} is set to {@link FaultCode#CUSTOM}. 
* 
* <p>The format used is that of {@link QName#toString()}, i.e. "{" + Namespace URI + "}" + local part, where the 
* namespace is optional. 
* 
* <p>Note that custom Fault Codes are only supported on SOAP 1.1. 
*/ 
String customFaultCode() default ""; 

所以,我剛剛決定去看看那是什麼{@link QName#toString()}

public String toString() { 
    if (namespaceURI.equals(XMLConstants.NULL_NS_URI)) { 
     return localPart; 
    } else { 
     return "{" + namespaceURI + "}" + localPart; 
    } 
} 

如果這一XMLConstants.NULL_NS_URI是這樣的:

public static final String NULL_NS_URI = ""; 

從這裏看起來它足以讓你聲明像pla在字符串:

customFaultCode="Server Error" 

但如果你想在xmlns聲明移到頂層,你應該考慮在您的自定義多采用低級別的API AbstractSoapFaultDefinitionExceptionResolver擴展:

((SoapMessage) messageContext.getResponse()).getEnvelope().addNamespaceDeclaration("star", "http://www.starstandard.org/STAR/5"); 

,右,與原始前綴使用customFaultCode

customFaultCode="star:Server Error" 
+0

嗨阿爾喬姆,感謝您的詳細的郵件。我發現這個問題。有一個來自AbstractSoapFaultDefinitionExceptionResolver.getFaultDefinition()的方法調用如下:fault = soap11Body.addFault(definition.getFaultCode(),faultStringOrReason,definition.getLocale());所以在SaajSoap11Body中,有一個Assert語句Assert.hasLength(faultCode.getNamespaceURI(),「faultCode的namespaceUri不能爲空」);.這是造成問題的原因。 –

+0

好吧,如果你能夠在根目錄''上聲明'xmlns',你仍然可以像'{namespace}'實例一樣聲明它。根據'FaultImpl',它應該'確保NamespaceIsDeclared()',這意味着重用和現有的'xmlns'。 –

+0

我能夠將名稱空間聲明帶入通過重寫resolveExceptionInternal方法,但我不能將名稱空間聲明帶到標籤 –

0

這似乎是一個老的文章,但只是想盡力幫忙。我認爲你不應該擔心故障代碼和faultdescription。 soapFault元素中實際上有第三個字段,名爲detail。該元素有兩個名爲code和description的子元素。用它來傳送故障信息。

檢查這個帖子:http://memorynotfound.com/spring-ws-add-detail-soapfault-exception-handling/

希望這可以幫助。 謝謝

+0

請在此填寫答案的相關部分,因爲鏈接可能會隨時間而改變。 –