使用Spring bean记录轴客户端请求和响应

时间:2017-02-03 16:12:54

标签: spring soap jax-ws axis

我使用Apache Axis作为SOAP客户端与spring建立集成。

我能够设置client-config.wsdd来将处理程序配置为弹出上下文之外的类。我想要做的是配置处理程序,使其在spring上下文中。这可能吗?

这是我当前的client-config.wsdd

<?xml version="1.0" encoding="UTF-8"?>
<deployment name="defaultClientConfig"
            xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

    <handler name="log" type="java:xxx.xxx.handler.SOAPLogHandler">
    </handler>

    <globalConfiguration>
        <parameter name="disablePrettyXML" value="false"/>
        <requestFlow>
            <handler type="log"/>
        </requestFlow>
        <responseFlow>
            <handler type="log"/>
        </responseFlow>
    </globalConfiguration>

    <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
</deployment>

我也在spring注册了服务:

<bean id="wsYPSoap" class="xxx.xxx.core.ws.WsYPSoapProxy">
    <constructor-arg value="${xxx.service.url}" />
</bean>

1 个答案:

答案 0 :(得分:0)

我一直在寻找一种方法来直接使用Spring bean作为Axis客户端的处理程序,并且正是为了记录请求/响应细节。

目前似乎没有简单明了的方法来做到这一点。

然而,有一种方法可以通过应用程序根上下文从Axis处理程序访问Spring bean来实现。这里几乎没有问题:

  • 当需要将轴处理程序作为简单类(而不是bean)进行实例化时

  • 处理程序实例在调用invoke()方法时不能依赖于任何servlet(或Faces)上下文的存在

因此,您必须将Spring bean放在根应用程序上下文中。问题是您无法以通常的方式访问应用程序上下文(即通过ServletContext的{​​{1}})。解决方法是创建自己的FacesContext bean,它将在应用程序启动时存储对根应用程序上下文的引用,供您在Axis处理程序中使用。

最小ApplicationContextAware bean实现示例:

ApplicationContextAware

并在public class ApplicationContextProvider implements ApplicationContextAware { private static ApplicationContext rootAppContext; @Override public void setApplicationContext(ApplicationContext ctx) throws BeansException { rootAppContext = ctx; } public static ApplicationContext getApplicationContext() { return rootAppContext; } } 中声明bean:

application-context.xml

请注意声明中的<bean id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" /> 这很重要。由于此bean未在任何地方引用(或自动连接),因此Spring不会创建它的实例,因为Spring使用惰性策略来创建bean。将lazy-init="false"设置为false可确保在应用启动时创建bean。

如果您的数据库日志记录bean(由lazy-init类实现)由Spring正确设置和加载/创建,您可以在Axis处理程序中访问它,如下所示:

DBLogBean

确保在从上下文获取DB bean之前检查ApplicationContext ctx = ApplicationContextProvider.getApplicationContext(); if (ctx != null) { DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId"); if( bean != null ) { bean.doLogOrSomething(); } } 是否返回ApplicationContextProvider.getApplicationContext()。现在注意,您还必须检查null是否返回ctx.getBean()

如果这不是一个选项(即由于某种原因,每当调用Axis处理程序时你必须拥有DB bean),那么你必须确保Axis处理程序只在之后被称为 {{1已经创建了bean。但是,该主题超出了范围;)

  

注意:使用null创建bean a   创建bean实例的首选方法。豆应该是   由其他bean /代码自动连线/引用并留给Spring来管理   他们的生命周期。例如,强制创建bean的一个缺点   在启动时,您无法确定它们已在何时创建   并且变得可用,除非你采取额外的步骤来处理(或   确保它们被其他代码引用但是,为什么要使用它们   ApplicationContextProvider首先是?)。