使用MyEclipse、Spring 2.0、XFire和tomcat 5或6开发WebService 时,初始化Spring对象时抛出以下异常:
Error initializing XFireServlet.
java.lang.IllegalStateException: Could not find valid implementation for: 2.0
at org.apache.xbean.spring.context.impl.XBeanHelper.createBeanDefinitionReader(XBeanHelper.java:48)
at org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:74)
at org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
at org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)
at org.codehaus.xfire.transport.http.XFireConfigurableServlet.createXFire(XFireConfigurableServlet.java:54)
at org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:45)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4045)
问题的原因是因为xfire不支持spring2.0的新特性,需要修改service.xml文件,将beans元素的命名空间放到services元素上,修改后的xml如下:
<beans>
<services xmlns="http://xfire.codehaus.org/config/1.0">
</services>
</beans>
另外,由于我使用了MyEclipse的Spring Capailities和WebService Capailities(使用xfire),由于后者自带了Spring1.2.6的包,造成了和2.0版本的冲突,所以必须作以下工作:
删除<MyEclise_Home>/eclipse\plugins\com.genuitec.eclipse.ws.xfire_5.9.100\data\1.2\lib目录的Spring1.2.6包
删除Tomcat/Webapps/<项目目录>/WEB-INF/lib目录下的Spring1.2.6包(好像重新部署不能删除已经存在的包)
重新启动MyEclipse
问题解决。