我有一条骆驼路线,可以通过Soap端点发送消息。
我想用SOAP登录和注销消息以及一些自定义数据。因此,我为CxfEnpoint bean添加了拦截器。
@Bean
public CxfEndpoint myEndpoint(){
CxfEndpoint cxfEndpoint = new CxfEndpoint();
cxfEndpoint.setAddress("myuri");
cxfEndpoint.setServiceClass(SomeType.class);
cxfEndpoint.setDataFormat(DataFormat.POJO);
cxfEndpoint.setLoggingFeatureEnabled(true);
//LoggingINInterceptor
cxfEndpoint.getInInterceptors().add(new Interceptor<Message>() {
@Override
public void handleMessage(Message message) throws Fault {
LOGGER.info("Request body: ${body}"); ;
}
@Override
public void handleFault(Message message) {
LOGGER.info("Request fault body: ${body}"); ;
}
});
//LoggingOutInterceptor
cxfEndpoint.getOutInterceptors().add(new Interceptor<Message>() {
@Override
public void handleMessage(Message message) throws Fault {
LOGGER.info("Response body: ${body}");
}
@Override
public void handleFault(Message message) {
LOGGER.info("Response fault body: ${body}"); ;
}
});
return cxfEndpoint;
}
路线如下:
from("direct:myroute").routeId("cxf_myroute")
.streamCaching()
.setHeader(CxfConstants.OPERATION_NAME, constant("MyOperationName"))
.log(LoggingLevel.INFO, "Call to cxf")
.to("cxf:bean:myEndpoint").id("call_ws")
.log(LoggingLevel.INFO, "Response from cxf")
.process(responseProcessor).id("response_transform").end();
我得到异常:
{"timestamp":"2018-07-12T11:53:39.423+00:00","level":"ERROR","logger_name":"org.apache.camel.processor.DefaultErrorHandler","stack_trace":"java.lang.ClassCastException: myapp.RouteConfiguration$2 cannot be cast to org.apache.cxf.phase.PhaseInterceptor\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.add(PhaseInterceptorChain.java:232)\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.add(PhaseInterceptorChain.java:223)\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.add(PhaseInterceptorChain.java:214)\r\n\tat org.apache.cxf.phase.PhaseChainCache.getChain(PhaseChainCache.java:89)\r\n\tat org.apache.cxf.phase.PhaseChainCache.get(PhaseChainCache.java:71)\r\n\tat org.apache.cxf.endpoint.ClientImpl.setupInterceptorChain(ClientImpl.java:966)\r\n\tat org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:486)\r\n\tat org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:420)\r\n\tat org.apache.camel.component.cxf.CxfProducer.process(CxfProducer.java:133)\r\n\tat org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)\r\n\tat org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)\r\n\tat org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)\r\n\tat org.apache.camel.processor.Pipeline.process(Pipeline.java:138)\r\n\tat org.apache.camel.processor.Pipeline.process(Pipeline.java:101)\r\n\tat org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)\r\n\tat org.apache.camel.component.direct.DirectBlockingProducer.process(DirectBlockingProducer.java:53)\r\n\tat org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)\r\n\tat org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)\r\n\tat org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)\r\n\tat org.apache.camel.processor.Pipeline.process(Pipeline.java:138)\r\n\tat org.apache.camel.processor.Pipeline.process(Pipeline.java:101)\r\n\tat org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)\r\n\tat org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)\r\n\tat org.apache.camel.http.common.CamelServlet.doService(CamelServlet.java:194)\r\n\tat org.apache.camel.http.common.CamelServlet.service(CamelServlet.java:73)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:790)\r\n\tat io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)\r\n\tat
我还研究了使用LoggingInInterceptor / LoggingOutInterceptor(How to log Apache CXF Soap Request and Soap Response using Log4j),但是找不到添加自定义逻辑甚至自定义文本的方法。
任何帮助表示赞赏。
P.S。我知道我可以直接在路径中放置日志,但是它们将包含尚未编组的正文和无Soap头,因此这不是一种选择。
答案 0 :(得分:1)
要删除异常,请执行以下操作:
//LoggingINInterceptor
cxfEndpoint.getInInterceptors().add(new LoggingInInterceptor() {
@Override
public void handleMessage(Message message) throws Fault {
LOGGER.info("Request body: ${body}");
}
@Override
public void handleFault(Message message) {
LOGGER.info("Request fault body: ${body}");
}
});
//LoggingOutInterceptor
cxfEndpoint.getOutInterceptors().add(new LoggingOutInterceptor() {
@Override
public void handleMessage(Message message) throws Fault {
LOGGER.info("Response body: ${body}");
}
@Override
public void handleFault(Message message) {
LOGGER.info("Response fault body: ${body}");
}
});
对于自定义日志记录,只需禁用日志记录功能,然后使用覆盖的方法对消息进行操作即可。在记录方法LoggingInInterceptor \ LoggingOutInterceptor类中可以看到cxf的功能。