如何处理RAW SOAP响应?

时间:2019-03-18 09:59:40

标签: java soap cxf interceptor

我有这个肥皂处理程序:

@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服务

1 个答案:

答案 0 :(得分:2)

由于至少两个原因,CXF拦截器未“自身”链接到请求或响应:

  • 许多拦截器都可以在两侧工作(例如记录肥皂有效载荷)
  • 关于应用程序的客户端/服务器性质,存在事物的请求/响应方面的对称性。

因此CXF的工作方式是将拦截器绑定到“链”,由CXF在运行时创建和管理“链”,并考虑到以上所有组合:IN,OUT,IN_FAULT,OUT_FAULT。您可以阅读有关here的所有信息。

如果您当前的拦截器处理“请求”,则意味着以下两种情况之一:

  • 如果您的应用程序是服务器,则您的拦截器将绑定到“ IN”链
  • 如果您的应用程序是客户端,那么您的拦截器将绑定到“ OUT”链

如果要处理响应和请求,则需要查找将自定义拦截器绑定到链的方式/位置,通常在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”消息),它们是“如何访问原始文件”的一个很好的例子。内容而不会破坏任何东西。”