xfire發佈的Webservice中Spring注入爲空的解決方案

Spring框架使用中注入爲空是一個比較頭疼的問題,遇到Webservice和Spring框架配合時,這個問題更容易出現並很難發現問題的緣由。web

在作SSO系統中就遇到這樣的問題,在Service的實現類中注入Ibatis數據庫操做的Mapper一直爲空,最終發現緣由是xfire和Spring配合使用時和普通使用xfire的配置方式不一樣spring

 

xfire能夠快速發佈Webservice,一般狀況下,只須要下邊幾個步驟。數據庫

1. 建立Service接口和實現類瀏覽器

    例如SSOMethodsServices和SSOMethodsImplapp

    實現類中包括Spring註解形式的注入框架

@Autowired
private AccountMapper accountMapper;

2. 在web.xml中加入xfire的配置測試

  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <display-name>XFire Servlet</display-name>
    <servlet-class>
        org.codehaus.xfire.transport.http.XFireConfigurableServlet
    </servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/servlet/XFireServlet/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

3.  在classpath目錄下建立目錄META-INF>xifre->services.xmlurl

在services.xml文件中配置服務spa

<?xml version="1.0" encoding="UTF-8"?>  
<beans>  
<service xmlns="http://xfire.codehaus.org/config/1.0">  
    <name>SSOMethodsServices</name>  
    <serviceClass>com.test.sso.SSOMethodsServices</serviceClass>  
    <implementationClass>com.test.sso.impl.SSOMethodsImpl</implementationClass>  
</service>      
</beans> 

 

這樣,在瀏覽器輸入 ip:port/projectname/services 就能夠看到發佈的Webservice,點擊wsdl能夠看到wsdl文件。code

可是用soapUI進行測試,發現注入的accountMapper爲空。出現問題。

 

嘗試了直接手動注入,加@Component註解並添加包掃描等各類方法都沒法注入,後來發現其實在xfire的example目錄下有spring的例子,採用了不一樣的配置方法,這種方式證實是有效的。

主要區別是:

1. servlet class使用org.codehaus.xfire.spring.XFireSpringServlet  而不是org.codehaus.xfire.transport.http.XFireConfigurableServlet。這一點是最關鍵的。

2. 使用一個xfire-servlet.xml配置文件配置服務而不是services.xml,在web.xml的context-param中添加xfire-servlet.xml。

3. 在applicationContext.xml中加入Webservice實現類的Bean。

具體配置以下,其中Service類和Impl類不變

web.xml中部分配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/xfire-servlet.xml</param-value>
</context-param>

<servlet>  
    <servlet-name>XFireServlet</servlet-name>  
    <servlet-class>  
        org.codehaus.xfire.spring.XFireSpringServlet  
    </servlet-class>  
</servlet>
<servlet-mapping>  
    <servlet-name>XFireServlet</servlet-name>  
    <url-pattern>/servlet/XFireServlet/*</url-pattern>  
</servlet-mapping>  
<servlet-mapping>  
    <servlet-name>XFireServlet</servlet-name>  
    <url-pattern>/services/*</url-pattern>  
</servlet-mapping> 

xfire-servlet.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- START SNIPPET: xfire -->
    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/SSOMethodsServices">
                    <ref bean="sso"/>
                </entry>
            </map>
        </property>
    </bean>
    
    <!-- Declare a parent bean with all properties common to both services -->
    <bean id="sso" class="org.codehaus.xfire.spring.remoting.XFireExporter">
        <property name="serviceFactory">
            <ref bean="xfire.serviceFactory"/>
        </property>
        <property name="xfire">
            <ref bean="xfire"/>
        </property>
        <property name="serviceBean">
            <ref bean="SSOMethodsImpl"/>
        </property>
        <property name="serviceClass">
            <value>com.test.sso.SSOMethodsServices</value>
        </property>
    </bean>
    <!-- END SNIPPET: xfire -->
</beans>

applicationContext.xml中加入一條Bean配置

<bean id="SSOMethodsImpl" class="com.test.sso.impl.SSOMethodsImpl"/>

這樣的配置條件下,Webservice發佈成功,而且accountMapper注入成功。

相關文章
相關標籤/搜索