记录SOAP消息

时间:2011-06-21 07:11:44

标签: java web-services 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 :: oracle.j2ee.ws.saaj.soap.soap11.Message11@715346

任何提示?

3 个答案:

答案 0 :(得分:13)

如果messageSOAPMessage,请执行以下操作:

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

现在String 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 :(得分:2)

您看到的是SOAPMessage的toString。您可能必须查找javadoc以查看是否可以从Oracle的SOAPMessage获取SOAPEnvelope,并且应该包含传入/传出的SOAP消息。

编辑:请检查this以获取getSoapHeader()和getSoapBody()以解构soap消息。对于Oracle的SOAPMessage包装器,您可能需要弄清楚相同的内容。

答案 2 :(得分:2)

克拉底鲁'如果您不想记录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();