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
问题解决。
分享到:
相关推荐
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而CXF和Spring都是Java生态系统中的关键组件。本文将深入探讨如何将CXF与Spring框架整合,以构建高效且灵活的Web服务解决方案。 首先,让我们了解CXF。...
【CXF和Spring搭建Web服务代码详解】 在Java开发领域,CXF和Spring框架的结合是构建高效、灵活的Web服务的常见选择。CXF是一个开源的SOAP和RESTful Web服务框架,它允许开发者轻松地创建和消费Web服务。而Spring...
在IT行业中,开发Web服务是常见的需求,而CXF和Spring框架的结合为开发者提供了一种高效、灵活的方式来实现Web Service。本篇将深入探讨如何利用CXF和Spring来创建、部署和消费Web Service。 CXF,全称CXF Commons ...
在Java企业级开发中,Apache CXF和Spring框架的整合是常见的实践,它们结合可以创建高效、灵活的服务提供和消费平台。Apache CXF是一个开源的Web服务框架,它支持多种Web服务标准,如SOAP、RESTful等。而Spring框架...
在 Maven 或 Gradle 的配置文件中,添加相应的依赖项,确保 CXF 和 Spring 框架的版本兼容。 2. **创建服务接口**:定义你的 Web 服务接口,通常是一个 Java 接口,包含你要暴露的 Web 方法。 3. **实现服务接口**...
在IT行业中,Web服务是不同系统间进行数据交换和交互的一种标准方式,而CXF和Spring是实现Web服务的两个重要工具。本文将深入探讨如何将Apache CXF与Spring框架整合,以构建高效、灵活的Web服务解决方案。 Apache ...
5. **错误处理**:Spring和CXF的集成还允许开发者定义自定义的异常处理器,将CXF抛出的异常转换为业务友好的错误信息,提高系统的健壮性和用户体验。 6. **测试支持**:在Spring测试框架的支持下,可以方便地对CXF...
本实例将引导读者逐步了解如何利用CXF、Spring和Maven创建、测试和部署Web服务,提供了一个完整的Java Web服务开发流程的实践案例。通过这个实例,开发者不仅可以掌握Web服务的基本概念和技术,还能深入理解这些工具...
在Java企业级应用开发中,CXF和Spring框架的整合是常见的实践,它们共同构建了高效、灵活的服务层。CXF是一个开源的Web服务框架,它支持SOAP、RESTful等多种Web服务标准,而Spring框架则提供了强大的依赖注入、事务...
- **灵活性**:Spring和CXF的结合提供了高度的灵活性,可以方便地切换不同的协议、数据格式和传输机制。 - **易用性**:通过Spring的管理,服务的生命周期可以得到很好的控制,同时降低了服务的复杂性。 - **...
通过这种方式,你可以轻松地利用Spring和CXF的优势,构建可扩展、可维护的Web服务。这种集成方式也允许你在同一项目中使用Spring的其他功能,如数据库连接池、事务管理和安全控制,从而构建完整的分布式系统。
Apache CXF是一个开源服务框架,它允许开发者创建和消费Web服务,而Spring框架则是Java应用开发的强大支撑,提供了依赖注入、AOP(面向切面编程)等功能,两者结合可以轻松构建服务提供者和服务消费者。 在本示例中...
总结来说,"基于maven的cxf+spring简单demo"项目展示了如何利用Maven管理依赖,借助Spring和CXF构建一个简单的Web服务。这个过程涉及Spring的bean配置、CXF端点声明以及Maven插件的使用,是学习和理解这两者集成的很...
利用CXF和Spring结合搭建的SOA例子,内容包含服务端配置和一个客户端测试配置,服务器端服务配置在beans.xml中,web.xml文件需要修改;客户端测试配置地址是demo.spring.client下的client-beans.xml,测试类为...
"CXF+Spring整合"是企业级Java应用程序中常用的一种技术组合,它结合了Apache CXF(一个用于构建和服务导向架构的开源框架)和Spring框架的优势,以实现高效、灵活的服务开发和管理。在Java世界里,CXF常用于创建Web...
在与Spring结合时,CXF服务可以通过Spring的依赖注入(DI)和配置管理功能来轻松管理和扩展。 在"**cxf+spring+client**"的场景中,我们通常会创建一个Spring配置文件,定义CXF客户端的bean。这个bean将包含服务的...
【描述】"CXF2.5.0+Spring2.5 集成DEMO" 提供了一个实际的演示项目,展示了如何在Spring 2.5上下文中配置和使用CXF 2.5.0版本。这个DEMO可能包括了创建服务提供者、客户端以及相关的配置文件,帮助开发者理解如何在...
【标题】"cxf2.7+spring4" 指的是Apache CXF 2.7版本与Spring框架4.1.5版本的整合应用。Apache CXF是一个开源的Java框架,主要用于构建和开发服务导向架构(SOA)中的Web服务。而Spring框架则是一个广泛使用的Java...
通过CXF创建服务,利用Spring进行组件管理和依赖注入,再借助Struts2处理用户交互,可以构建出高效且稳定的业务系统。压缩包中的"CXFWebService"可能包含了项目配置、源代码、依赖库等资源,帮助开发者理解和学习...
**标题解析:** "cxf与Spring的整合实例(适合初学者)" 指的是一个教程或示例项目,旨在帮助初次接触CXF和Spring框架的开发者理解如何将这两个强大的开源工具集成在一起。CXF是一个流行的开源服务框架,常用于构建...