如何处理RAW SOAP响应?

问题描述 投票:0回答:1

我有这个肥皂处理程序:

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

java soap cxf interceptor
1个回答
2
投票

至少有两个原因,CXF拦截器并非“本身”与请求或响应相关联:

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

因此,CXF的工作方式是拦截器绑定到“链”,CXF在运行时创建和管理,并且它们考虑了上述的所有组合:IN,OUT,IN_FAULT,OUT_FAULT。你可以阅读所有关于他们here

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

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

如果要处理响应和请求,则需要查找自定义拦截器绑定到链的方式/位置,这通常位于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”消息),它们就像你能看到的“如何在不破坏任何东西的情况下访问原始内容”那样很好。

© www.soinside.com 2019 - 2024. All rights reserved.