我使用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>
答案 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
首先是?)。