我有这个肥皂处理程序:
@Slf4j
public class ResponseInterceptor implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
try {
SOAPMessage message = context.getMessage();
ByteArrayOutputStream out = new ByteArrayOutputStream();
message.writeTo(out);
String strMsg = new String(out.toByteArray());
} catch (SOAPException | IOException e) {
e.printStackTrace();
}
return false;
}
但是我可以处理请求。是否有类似的方式来处理响应?
编辑:
我有下一个任务:我需要处理来自SOAP服务的所有RAW响应,对其进行过滤,然后发送给apache kafka。我不想进行拆组操作,我想将RAW响应发送到kafka
EDIT2:
我写了拦截器:
@Slf4j
public class ResponseInterceptor extends AbstractPhaseInterceptor<Message> {
public ResponseInterceptor() {
super(Phase.PRE_UNMARSHAL);
}
@Override
public void handleMessage(Message message) throws Fault {
try {
SOAPMessage soapMessage = message.getContent(SOAPMessage.class);
ByteArrayOutputStream out = new ByteArrayOutputStream();
soapMessage.writeTo(out);
String strMsg = new String(out.toByteArray());
message.getInterceptorChain().abort();
} catch (SOAPException | IOException e) {
e.printStackTrace();
}
}
}
但是,如果我致电message.getInterceptorChain().abort();
,则会在服务中出现异常。但是我只需要停止这种响应,而不是传递到Web服务
答案 0 :(得分:2)
由于至少两个原因,CXF拦截器未“自身”链接到请求或响应:
因此CXF的工作方式是将拦截器绑定到“链”,由CXF在运行时创建和管理“链”,并考虑到以上所有组合:IN,OUT,IN_FAULT,OUT_FAULT。您可以阅读有关here的所有信息。
如果您当前的拦截器处理“请求”,则意味着以下两种情况之一:
如果要处理响应和请求,则需要查找将自定义拦截器绑定到链的方式/位置,通常在CXF的配置文件中(请参阅:“编写和配置拦截器” abose链接)。
许多人使用带有Spring配置的CXF,因此,像这样:在整个CXF(总线)级别添加拦截器:
<bean id="MyInterceptor" class="demo.interceptor.MyInterceptor"/>
<!-- We are adding the interceptors to the bus as we will have only one endpoint/service/bus. -->
<cxf:bus>
<cxf:inInterceptors>
<ref bean="MyInterceptor"/>
</cxf:inInterceptors>
<cxf:outInterceptors>
<ref bean="MyInterceptor"/>
</cxf:outInterceptors>
</cxf:bus>
但是它也可以在enpoint级别完成。
进一步阅读:How to catch any exceptions in a SOAP webservice method?
我可以扩展很多,但我建议您查看org.apache.cxf.interceptor.LoggingInInterceptor
(或相应的“ Out”消息),它们是“如何访问原始文件”的一个很好的例子。内容而不会破坏任何东西。”