xfire发布的Webservice中Spring注入为空的解决方案

Spring框架使用中注入为空是一个比较头疼的问题,遇到Webservice和Spring框架配合时,这个问题更容易出现并很难发现问题的原因。

在做SSO系统中就遇到这样的问题,在Service的实现类中注入Ibatis数据库操作的Mapper一直为空,最终发现原因是xfire和Spring配合使用时和普通使用xfire的配置方式不同

 

xfire可以快速发布Webservice,通常情况下,只需要下边几个步骤。

1. 创建Service接口和实现类

    例如SSOMethodsServices和SSOMethodsImpl

    实现类中包括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.xml

在services.xml文件中配置服务

<?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文件。

xfire发布的Webservice中Spring注入为空的解决方案

但是用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注入成功。

你可能感兴趣的:(webservice)