2011-06-21 231 views
6

我創建了一個攔截SOAP消息交換的請求 - 響應循環的類,並且我想記錄消息交換。 什麼是最好的方式,以便我可以在我的日誌文件中記錄SOAP消息?日誌SOAP消息

我不希望它被打印在我的日誌文件中,但我只想訪問 並查看請求和響應SOAP信封。

我試着用這個代碼:

public class LogHandler{  
    private static final Logger _LOG; 
    @Override 
    protected void handleResponse(SOAPMessage message) 
     logSOAPMessage(message); 
    } 
    @Override 
    protected void handleRequest(SOAPMessage message) 
     logSOAPMessage(message); 
    }  
    private void logSOAPMessage(SOAPMessage message){ 
     _LOG.info(":: Logging SOAP Message :: " + message.toString()); 
    } 
} 

但犯規獲得所需要的信息。

:: Logging SOAP Message :: [email protected] 

任何提示?

回答

2

你所看到的是SOAPMessage的toString。您可能需要查找javadoc以查看是否可以從Oracle的SOAPMessage獲取SOAPEnvelope,並且該SOAPEnvelope應該包含傳入/傳出的SOAP消息。

編輯︰請檢查this getSoapHeader()和getSoapBody()解構肥皂消息。您可能需要爲Oracle的SOAPMessage包裝弄清楚這一點。

10

如果messageSOAPMessage然後執行以下操作:

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
message.writeTo(bout); 
String msg = bout.toString("UTF-8"); 

現在字符串msg有SOAP消息,就可以登錄了。

在您的例子:

private void logSOAPMessage(SOAPMessage message){ 
    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    message.writeTo(bout); 
    String msg = bout.toString("UTF-8"); 
    _LOG.info(":: Logging SOAP Message :: " + msg);  
} 
1

克拉底魯的回答是不夠的,當你不希望記錄SOAP附件。

這裏有一個只記錄信封方式:

// Get the Envelope Source 
Source src = message.getSOAPPart().getContent() ; 

// Transform the Source into a StreamResult to get the XML 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.INDENT, "no"); 
StreamResult result = new StreamResult(new StringWriter()); 
transformer.transform(src, result); 
String xmlString = result.getWriter().toString();