CXF和Spring结合的非常紧密,默认发布Server端是需要用到Spring的,但是项目中用到的Spring jar包比较老2.0,CXF版本2.3.1,跟Spring不兼容,需要换乘Spring2.5,但是换jar包对原来的项目存在风险,上网搜了一个脱离Spring运行的方法。
写一个类继承CXFNonSpringServlet,重写loadBus方法。
@SuppressWarnings("unchecked")
public void loadBus(ServletConfig servletConfig) throws ServletException {
super.loadBus(servletConfig);
Bus bus = this.getBus();
BusFactory.setDefaultBus(bus);
Enumeration<String> enums = getInitParameterNames();
while (enums.hasMoreElements()) {
String key = enums.nextElement();
String value = getInitParameter(key);
try {
Class clz = Class.forName(value);
try {
Endpoint.publish(key, clz.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在web.xml里将要发布的类配置一下,可以配置多个。
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
com.infodms.ws.util.MyCXFNoSpringServlet
</servlet-class>
<init-param>
<param-name>/TestService</param-name>
<param-value>com.infodms.ws.test.TestServiceImpl</param-value>
</init-param>
<init-param>
<param-name>/HelloWorld</param-name>
<param-value>com.infodms.ws.test.HelloWorldImpl</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
配置完成,启动tomcat,报错,还是加载了spring,但是代码确实走了刚刚加的MyCXFNoSpringServlet
java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.bus.spring.BusApplicationListener' defined in class path resource [META-INF/cxf/cxf.xml]: Initialization of bean failed; nested exception is java.lang.NoSuchMethodError: org.springframework.context.support.AbstractApplicationContext.addApplicationListener(Lorg/springframework/context/ApplicationListener;)V
org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:96)
调试了一下源码,内部需要从环境变量中取得org.apache.cxf.bus.factory的值,如果为空就默认按照spring的方式加载。于是在类的最开始加入一行代码。
System.setProperty("org.apache.cxf.bus.factory", "org.apache.cxf.bus.CXFBusFactory");
再次启动tomcat,报错,由异常可知WoodstoxValidationImpl类没有默认构造方法,通过反射实例化对象报错,看了一下这个类的源码,确实没有无参构造方法。
Caused by: java.lang.InstantiationException: org.apache.cxf.wstx_msv_validation.WoodstoxValidationImpl
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at org.apache.cxf.bus.extension.Extension.load(Extension.java:110)
http://cxf.547215.n5.nabble.com/jira-Created-CXF-3077-java-lang-InstantiationException-org-apache-cxf-wstx-msv-validation-WoodstoxVal-td3228305.html
引用这个,加入三个jar包
woodstox-core-asl-4.0.8.jar
stax2-api-3.0.2.jar
msv.jar
问题解决。
分享到:
相关推荐
webserivce.、cxf整合spring,用的是spring3和cxf3。欢迎大家下载尝试
cxf+spring实现webservice
WebService的CXF整合Spring有源码和jar包
CXF和Spring搭建webservice代码
CXF+spring+struts实现WebService
cxf+spring整合,只要把项目导入到myeclipse中,就可以运行。
内容为CXF整合spring的服务端和客户端开发例子,注释不太详尽,网上的教程比较多,但是多跑不起来,特地把整个工程都打包给大家做参考,程序内容均来自网上整理,均可以运行。
CXF源码:CXF_Spring源码 CXF源码:CXF_Spring源码
利用CXF和Spring结合搭建的SOA例子,内容包含服务端配置和一个客户端测试配置,服务器端服务配置在beans.xml中,web.xml文件需要修改;客户端测试配置地址是demo.spring.client下的client-beans.xml,测试类为...
cxf+spring开发所必备的jar包压缩包
基于maven的cxf+spring简单demo,spring版本为4.1.6,cxf版本为3.0.8
cxf+spring+client+springmvc
简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar...
cxf spring maven 实例 webservice
CXF整合Spring需要用到的JAR包
cxf与Spring一个简单的小例子,希望多初学者有所帮助。不明白的联系我
自己用做项目时用到CXF整合Spring,写了下步骤,希望能帮到有需要的人!
CXF集成Spring发布WebService代码实例
最完整的的cxf与spring整合需要的jar文件
CXF是apache旗下的开源框架,是一套非常流行的web service框架,同时它能与spring进行完美结合。