使用Springbean记录Axis客户端请求和响应

使用Springbean记录Axis客户端请求和响应,spring,soap,jax-ws,axis,Spring,Soap,Jax Ws,Axis,我使用ApacheAxis作为SOAP客户端与spring进行了集成 我能够设置client-config.wsdd,将处理程序配置为spring上下文之外的类。我想做的是配置处理程序,使其位于spring上下文中。这可能吗 这是我当前的客户端配置.wsdd <?xml version="1.0" encoding="UTF-8"?> <deployment name="defaultClientConfig" xmlns="http://xml.apa

我使用ApacheAxis作为SOAP客户端与spring进行了集成

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

这是我当前的
客户端配置.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>

我正在寻找一种方法,将Springbean直接用作Axis客户端的处理程序,并且完全用于记录请求/响应细节

目前似乎没有简单直接的方法来做到这一点

然而,有一种方法可以通过应用程序根上下文从Axis处理程序访问Springbean。这里有几个问题:

  • Axis处理程序在需要作为简单类(而不是bean)时被实例化

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

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

最小
ApplicationContextAware
bean实现示例:

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;
    }
}
并在
application context.xml
中声明bean:

<bean id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" />
在从上下文获取DB bean之前,确保检查
ApplicationContextProvider.getApplicationContext()
是否返回
null
。注意,现在还必须检查
ctx.getBean()
是否返回
null

如果这不是一个选项(即,出于某种原因,无论何时调用Axis处理程序,您都必须拥有DB bean),那么您必须确保Axis处理程序只有在创建了
ApplicationContextProvider
bean之后才被调用。但是,该主题超出了此处的范围;)

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

ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
if (ctx != null) {
    DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId");
    if( bean != null ) {
        bean.doLogOrSomething();
    }
}