使用Spring bean的日志轴客户端请求和响应
我有一个使用Apache Axis作为SOAP客户端的spring设置集成。使用Spring bean的日志轴客户端请求和响应
我能够设置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>
我也有春天注册的服务:
<bean id="wsYPSoap" class="xxx.xxx.core.ws.WsYPSoapProxy">
<constructor-arg value="${xxx.service.url}" />
</bean>
我一直在寻找一种方式来直接使用的Spring bean作为Axis客户处理程序和完全用于记录请求/响应细节的目的。
看来目前没有简单直接的方法来做到这一点。
然而,有一种方法可以通过应用程序根上下文从Axis处理程序访问Spring bean。这里有几个问题:当他们需要一个简单的类(不豆)
处理程序实例不能依赖于任何Servlet的存在(或,即面
Axis处理程序被实例化当时)情况下他们
invoke()
方法被称为
正因为如此,你有你的Spring bean放置在根应用程序上下文。问题是,您无法以通常的方式访问应用程序上下文(即通过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 id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" />
注意的lazy-init="false"
在声明中,这是很重要。由于这个bean在任何地方都没有被引用(或自动连线),所以Spring不会创建它的实例,因为Spring使用惰性策略来创建bean。将lazy-init
设置为false可确保在应用程序启动时创建bean。
前提是你有你的数据库记录bean(由DBLogBean
类实现)正确设置并加载/由Spring创建的,您可以访问它在IE这样Axis处理程序:
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
if (ctx != null) {
DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId");
if(bean != null) {
bean.doLogOrSomething();
}
}
确保你检查ApplicationContextProvider.getApplicationContext()
是否返回null
或从上下文中提取DB bean之前。请注意,您现在还必须检查是否ctx.getBean()
返回null
或不。
如果这不是一个选项(即由于某种原因,每当Axis处理程序被调用,你必须有DB豆),那么你必须确保Axis处理程序只会被ApplicationContextProvider
bean已经被创建后称为。这话题,然而,超出范围在这里;)
注:使用
lazy-init="false"
创建豆不创建bean实例的 首选方式。豆类应该是 自动连线/由其他豆类/代码引用,并留给Spring管理 其生命周期。例如,在启动时强制创建豆类 的一个缺点是,您不能确定它们在哪一点创建了 并变得可用,除非您采取额外的步骤来处理该问题(或确保它们被其他代码引用但那么,为什么首先使用lazy-init="false"
?)。