Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 479|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-8-28 11:32:36 | 显示全部楼层 |阅读模式

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

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-4 03:20 , Processed in 0.055070 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表