我需要在应用程序的日志中提供请求和响应,但Apache CXF发送的请求在FastInfoset(Content-Type:application / fastinfoset)中,这导致请求和响应的日志不可读(因为它是二进制的) ).有没有办法解决这个问题,以便我保留FastInfoset消息(出于性能原因)但是我在日志中得到了正确的XML?
这是我现在拥有的CXF配置,如果有帮助的话:
logoutbound" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
logoutbound" />
logoutbound" />
预先感谢您的任何帮助.
最佳答案
我看了LoggingInInterceptor.logInputStream,似乎它不支持fastinfoset.但您可以使用自定义interceptor而不是LoggingInInterceptor和LoggingOutInterceptor来提取有效负载,对其进行解码并记录原始消息.
public class CustomInterceptor extends AbstractPhaseInterceptorIoUtils.readBytesFromStream(in);
ByteArrayInputStream bin = new ByteArrayInputStream(payload);
message.setContent(InputStream.class,bin);
//Decode from FastInfoset and write the payload in your preferred log system
OutputStream out = System.out
decodeFI(in,out);
}
public void handleFault(Message messageParam) {
//Invoked when interceptor fails
//Exception e = message.getContent(Exception.class);
}
}
替换XML文件
logoutbound" class="test.CustomInterceptor" />
找到如何解码FastInfoset的示例并不容易.使用DOM和FastInfoset-1.2.12.jar尝试此操作.在这个repo中,您有几个使用sTAX和SAX的示例
public void decodeFI(InputStream in,OutputStream out) throws Exception{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
DOMDocumentParser parser = new DOMDocumentParser();
parser.parse(doc,in);
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(out);
transformer.transform(source,result);
}