2017-02-03 114 views
0

我有一个使用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> 

回答

0

我一直在寻找一种方式来直接使用的Spring bean作为Axis客户处理程序和完全用于记录请求/响应细节的目的。

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

然而,有一种方法可以通过应用程序根上下文从Axis处理程序访问Spring bean。这里有几个问题:当他们需要一个简单的类(不豆)

  • 处理程序实例不能依赖于任何Servlet的存在(或,即面

    • Axis处理程序被实例化当时)情况下他们invoke()方法被称为

    正因为如此,你有你的Spring bean放置在根应用程序上下文。问题是,您无法以通常的方式访问应用程序上下文(即通过FacesContextServletContext)。解决方法是创建您自己的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"?)。