使用Springbean记录Axis客户端请求和响应
我使用ApacheAxis作为SOAP客户端与spring进行了集成 我能够设置client-config.wsdd,将处理程序配置为spring上下文之外的类。我想做的是配置处理程序,使其位于spring上下文中。这可能吗 这是我当前的使用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
客户端配置.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)时被实例化
- 在调用其
方法时,处理程序实例不能依赖于任何servlet(或面)上下文的存在invoke()
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();
}
}