2017-02-03 61 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"?)。

  • 相關問題