我创建了一个类来拦截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
有什么提示吗?
发布于 2011-06-21 15:23:47
您看到的是SOAPMessage的toString。您可能需要查找javadoc,看看是否可以从Oracle的SOAPMessage中获得SOAPEnvelope,它应该包含传入/传出的SOAP消息。
编辑:请检查getSoapHeader()和getSoapBody()的this以解构soap消息。对于Oracle的SOAPMessage包装器,您可能需要解决同样的问题。
发布于 2011-06-21 15:25:43
如果SOAPMessage
为message
,则执行以下操作:
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);
}
发布于 2015-02-25 21:20:34
当您不想记录SOAP附件时,Cratylus的回答是不够的。
以下是一种仅记录信封的方法:
// 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();
https://stackoverflow.com/questions/6421627
复制相似问题