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"可能包含的是用于集成CXF与Spring的必要jar包,如cxf-spring-integration.jar,这个文件通常包含了CXF与Spring集成所需的类和资源,使得开发者能够在Spring环境下...
在IT行业中,开发Web服务是常见的需求,而CXF和Spring框架的结合为开发者提供了一种高效、灵活的方式来实现Web Service。本篇将深入探讨如何利用CXF和Spring来创建、部署和消费Web Service。 CXF,全称CXF Commons ...
综上所述,这个“cxf+spring”的压缩包为开发者提供了一个基础平台,能够快速地搭建和运行基于CXF和Spring的Web服务应用。开发者只需要按照正确的配置和编程规范,就可以轻松地利用这些jar包进行开发,实现高效的...
将CXF与Spring整合的主要目的是利用Spring的管理能力来配置和控制CXF组件,例如服务端点、客户端代理等。这样可以实现更细粒度的控制,提高代码的可测试性和可维护性。 整合步骤如下: 1. **引入依赖**:首先,在...
此示例项目虽然注释不够详细,但通过运行和调试,你可以深入理解CXF和Spring如何协同工作,这对于学习和实践SOA(面向服务架构)非常有帮助。同时,由于项目能够正常运行,对于初学者来说,这是一个很好的学习起点。
在企业级应用开发中,Apache CXF 和 Spring 框架的整合是非常常见的,因为它们分别提供了强大的服务端和客户端的 Web 服务支持以及灵活的依赖注入和配置管理。本教程将详细介绍如何将 CXF 与 Spring 整合,帮助...
【CXF整合Spring详解】 CXF(CXF stands for "CXF is not just an XFire fork", but was originally named XFire)是一个开源的Java框架,它提供了服务导向架构(SOA)和Web服务的实现。CXF使得开发人员能够轻松地...
在IT行业中,CXF和Spring框架的整合是创建高效、灵活的Web服务的重要途径。"cxf_spring 相关 jar"的标题暗示了这个压缩包包含的是用于整合CXF与Spring的Java库。让我们深入了解一下CXF、Spring以及它们如何协同工作...
将CXF+Spring整合的项目导入MyEclipse后,可以利用其内置的服务器支持和调试工具,方便地部署和运行Web服务。 5. **开发实践** 在实际开发中,开发者需要编写服务接口和服务实现,然后在Spring配置文件中声明这些...
通过Spring Boot,我们可以更简洁地配置和运行CXF服务,无需复杂的XML配置。 总的来说,结合CXF和Spring框架,开发者可以构建健壮、可扩展的Web服务,同时享受到Spring带来的便利性和灵活性。无论是SOAP还是RESTful...
【标题】"CXF Spring Maven 实例"是一个关于如何整合并使用这些技术创建Web服务的教程。CXF是一个开源框架,主要用于构建和部署SOAP和RESTful Web服务,Spring则是一个广泛应用的Java企业级开发框架,而Maven是项目...
最后,通过Maven的cxf-codegen-plugin插件生成客户端和服务端的Stubs,并运行项目。访问指定的URL(如http://localhost:8080/hello?wsdl),就可以看到服务的WSDL描述。 【标签】"cxf"和"spring"表明这个项目主要...
在这个"**cxf+spring+client**"的主题中,我们将深入探讨CXF与Spring框架结合创建客户端服务的细节,以及如何利用Spring MVC来增强应用程序的交互性。 首先,让我们关注CXF。CXF允许开发者使用Java编程语言来定义和...
**标题解析:** "cxf与Spring的整合实例(适合初学者)" 指的是一个教程或示例项目,旨在帮助初次接触CXF和Spring框架的开发者理解如何将这两个强大的开源工具集成在一起。CXF是一个流行的开源服务框架,常用于构建...
通过阅读和运行这些代码,你可以更深入地理解如何将CXF与Spring集成以构建Web服务。 总的来说,使用CXF和Spring构建Web服务涉及了Java编程、Web服务原理、Spring框架的使用、以及CXF的相关配置和工具。这是一个典型...
CXF集成了Spring框架,使得构建和管理Web服务变得更加简便和灵活。本篇将深入探讨CXF与Spring的集成,以及如何通过它们来发布一个WebSocket服务的代码实例。 首先,我们了解CXF的核心功能。CXF提供了SOAP和RESTful...
【CXF源码分析】 ...通过分析`CXFSpring`和`CXFSpringClient`中的源码,我们可以更深入地理解CXF如何在Spring环境中运行,以及如何配置、发布和消费Web服务。这将有助于我们更好地在实际项目中应用和维护CXF服务。
1. **Spring的依赖注入**:Spring的核心特性之一就是依赖注入,它使得对象之间的关系可以在运行时动态配置,提高了代码的可测试性和可维护性。在整合CXF时,我们可以将CXF的服务实例化和配置交给Spring来处理。 2. ...
10. **commons-logging.jar**:通用日志库,CXF和Spring都依赖它来记录运行时信息。 11. **stax-api.jar** 和 **woodstox-core-asl.jar**:提供STAX(Streaming API for XML)解析器,用于高效处理XML文档。 12. *...