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

但是用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注入成功。
xfire发布的Webservice中Spring注入为空的解决方案的更多相关文章
- java程序调用xfire发布的webService服务(二)
在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步 ...
- 项目中Spring注入报错小结
之前在做单元测试时采用注解方式进行service对象的注入,但运行测试用例时对象要注入的service对象总是空的,检查下spring配置文件,我要配置的bean类xml文件已经包含到spring要加 ...
- 监听器中spring注入相关的问题
问题描述: 需求是要求在项目启动自动触发一个service中的线程的操作,使用监听器来实现,但是自定义监听器中spring注解service失败,通过WebApplicationContextUtil ...
- struts2的action中@Autowired注入为null的解决方案
今天遇到类似问题,记录下来以便以后查阅: @Aspect作用于action,致使action中的@Autowired注入为null的解决方案,以下三种任选一种: 1.去掉@Autowired,改用se ...
- java程序调用xfire发布的webService服务
昨天用xfire搭好了一个简单的webService的服务,可以在浏览器访问,今天便想要尝试以下如何调用这个服务及相关的方法.在网上查找了一些资料后,实现过程如下. 1.创建一个maven web项目 ...
- 解决cxf+spring发布的webservice,types,portType和message以import方式导入
用cxf+spring发布了webservice,发现生成的wsdl的types,message和portType都以import的方式导入的.. 原因:命名空间问题 我想要生成的wsdl在同个文件中 ...
- Axis2(7):将Spring的装配JavaBean发布成WebService
在现今的Web应用中经常使用Spring框架来装载JavaBean.如果要想将某些在Spring中装配的JavaBean发布成WebService,使用Axis2的Spring感知功能是非常容易做到的 ...
- Spring注入中byType和byName的总结
1.首先,区分清楚什么是byType,什么是byName. <bean id="userServiceImpl" class="cn.com.bochy.servi ...
- 线程中无法实例化spring注入的服务的解决办法
问题描述 在Java Web应用中采用多线程处理数据,发现Spring注入的服务一直报NullPointerException.使用注解式的声明@Resource和XML配置的bean声明,都报空指针 ...
随机推荐
- [转] C#.Net Socket网络通讯编程总结
1.理解socket1).Socket接口是TCP/IP网络的应用程序接口(API).Socket接口定义了许多函数和例程,程序员可以用它们来开发TCP/IP网络应用程序.Socket可以看成是网络通 ...
- 网络基本功(二十七):Wireshark抓包实例分析HTTP问题
转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese 介绍 HTTP的问题可能是由于慢速服务器或客户端,TCP性能问题,本文讨论上述问题 ...
- vsvim _vsvimrc 设置(转)
c_joewang的专栏 (转) vsvim安装到vs2010后可以使用绝大部分原生vim的编辑功能,包括宏录制,也可以通过配置设置键盘映射,关于支持的编辑功能等可以参考上面链接去查看相关文档. Vi ...
- apache rewrite rule
http://10.58.104.19:8008/site/833/3f11d2b44b7d3baa2149f26a30f8c68d/b.js?siteid=332323 将一个静态请求转换成一个动态 ...
- WPF中常用控件的属性
Source = new BitmapImage( new Uri( WangCaiConfig.GetCurrentDirectory() + imgStr, UriKind.RelativeOrA ...
- shell中常用的特殊字符
(1) * 代表0到无穷个任意字符 (2)?代表任意一个字符 (3)代表括号内任意一个字符 (4)[ - ] 代表一个范围中的任意一个字符 如[0-9] 即是代表0-9之间的一个数 (5)[^] 反向 ...
- 去掉iphone 的圆角样式
每次面对iphone这种丑丑的样式,我简直不能再愉快的写代码~~而且每次记不住那烦人的属性~~~必须记录下来~~ -webkit-appearance:none 为了下次不用再百度,终于背下来~~~
- Mysql笔记之 -- replace()实现mysql 替换字符串
mysql 替换函数replace()实现mysql 替换字符串 mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数 ...
- codeforces 455C 并查集
传送门 给n个点, 初始有m条边, q个操作. 每个操作有两种, 1是询问点x所在的连通块内的最长路径, 就是树的直径. 2是将x, y所在的两个连通块连接起来,并且要合并之后的树的直径最小,如果属于 ...
- HTML禁止使用右键
<html> <script type="text/javascript"> <!-- document.oncontextmenu=function ...