我有这个肥皂处理程序:
@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
Aaditi:
我写拦截器:
@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服务
至少有两个原因,CXF拦截器并非“本身”与请求或响应相关联:
因此,CXF的工作方式是拦截器绑定到“链”,CXF在运行时创建和管理,并且它们考虑了上述的所有组合:IN,OUT,IN_FAULT,OUT_FAULT。你可以阅读所有关于他们here。
如果您当前的拦截器处理“请求”,则意味着以下两种情况之一:
如果要处理响应和请求,则需要查找自定义拦截器绑定到链的方式/位置,这通常位于CXF的配置文件中(请参阅:在abose链接中“编写和配置拦截器”) 。
许多人使用CXF和Spring配置,因此,在整个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>
但它也可以在端点级别完成。
进一步阅读:How to catch any exceptions in a SOAP webservice method?
我可以扩展很多,但我建议你看一下org.apache.cxf.interceptor.LoggingInInterceptor
(或者相应的“Out”消息),它们就像你能看到的“如何在不破坏任何东西的情况下访问原始内容”那样很好。