我在這裏發現了一些關於如何從JAX-WS客戶端獲取XML響應的線程。就我而言,客戶端是通過Oracle的JDeveloper產品從WSDL生成的,並且將調用用.NET編寫的Document/Literal服務端點。我想要做的是從調用客戶端調用獲取XML響應,而不是從處理程序中獲取。如何從JAX-WS客戶端獲取XML響應體?
,我看到了這個問題,最近的主線是: http://www.coderanch.com/t/453537/Web-Services/java/capture-SoapRequest-xml-SoapResponse-xml
我不認爲我想生成一個調度呼叫,因爲對SOAP包的終端的XML架構是相當複雜的,和自動代理使通話變得微不足道。除非有其他方法來填充生成的bean,然後調用一些簡單生成XML的方法,然後我才能進行調用?
private void storeSOAPMessageXml(SOAPMessageContext messageContext) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
SOAPMessage soapMessage = messageContext.getMessage();
try {
soapMessage.writeTo(baos);
String responseXml = baos.toString();
log.debug("Response: " + responseXml);
PaymentGatewayXMLThreadLocal.set(responseXml);
} catch (SOAPException e) {
log.error("Unable to retrieve SOAP Response message.", e);
} catch (IOException e) {
log.error("Unable to retrieve SOAP Response message.", e);
}
}
我的想法是將響應保存到處理程序中的ThreadLocal中,然後在調用之後讀取它。這是否合理?因此,處理程序中的handleMessage和handleFault上面的代碼後,客戶端調用代碼調用該方法:
@Override
public String getSOAPResponseXML(Object clientstub) {
String returnValue = PaymentGatewayXMLThreadLocal.get();
return returnValue;
} // getSOAPResponseXML
看來有可能是畢竟另一種方式。在閱讀jax-ws-handlers之後,我看到該處理程序可以引入Application範圍變量。我改變了處理程序來做到這一點:
private void storeSOAPMessageXml(SOAPMessageContext messageContext) {
String xml = getSOAPMessageXml(messageContext);
// YourPayXMLThreadLocal.set(xml);
// put it into the messageContext as well, but change scope
// default of handler Scope, and client can't read it from responsecontext!
messageContext.put(SOAP_RESPONSE_XML, xml);
messageContext.setScope(SOAP_RESPONSE_XML, MessageContext.Scope.APPLICATION);
} // storeSOAPMessageXml
客戶端只是讀取它是這樣的:
@Override
public String getSOAPResponseXML(Object clientstub) {
String returnValue = null;
// works (assuming a threadlocal is ok)
// returnValue = YourPayXMLThreadLocal.get();
BindingProvider bindingProvider = (BindingProvider) clientstub;
// Thought this would work, but it doesn't - it returns null.
// Map<String, Object> requestContext = bindingProvider.getRequestContext();
// String returnValue = (String) requestContext.get(JaxWsClientResponseXmlHandler.SOAP_RESPONSE_XML);
// this works!!
Map<String, Object> responseContext = bindingProvider.getResponseContext();
System.out.println("has key? " + responseContext.containsKey(JaxWsClientResponseXmlHandler.SOAP_RESPONSE_XML));
returnValue = (String) responseContext.get(JaxWsClientResponseXmlHandler.SOAP_RESPONSE_XML);
return returnValue;
} // getSOAPResponseXML
我不只是想看到它,我想根據客戶端已知的事務ID#將其登錄到數據庫。我創建此日誌條目PRIOR發送請求。處理程序不會知道這個事務ID#(它不是請求的一部分 - 這是我的日誌)。我想知道來自調用的結果SOAP Response。在apache Axis中,我回應了另一個therad [here](http://stackoverflow.com/questions/3842900/is-it-possible-to-access-the-raw-soa-xml-message-in-a-jax -rpc-Java的客戶機/ 16572303#16572303)。我想到一個更新的WS客戶端堆棧會使這更容易。所以threadlocal可以嗎? – user1955401
jax-ws客戶端將soap響應解組爲來自付款網關的強類型對象。不幸的是,我們遇到了過去的情況,我們得到的未公開的錯誤代碼和字符串比預期/記錄的時間長。然後,我們的例程簡單地堅持迴應將失敗。那時,故障安全響應列(clob)也被添加到日誌中。如果我走你的路線,我的處理程序必須能夠堅持這個響應,因爲當我試圖將KEY/VALUE對放入處理程序並在客戶端讀取時它是空的。如果有幫助,我也使用MyBatis/Spring。 – user1955401