- 浏览: 2412 次
- 性别:
- 来自: 北京
最新评论
应用Spring DM和CXF在TOMCAT上发布WebService
1 目标
项目应用Spring DM实现模块化开发。系统和其他进程之间的控制信息希望能通过Webservice实现。要求如下:
Ø 动态发布
有多个Bundle需要发布WebService,所以希望创建一个Webservice Util(下面简称ws-util)的Bundle并提供易用的接口发布为OSGI的服务,其它Bundle可以通过调用该服务即可实现Webservice的发布。
Ø 依赖最小化
需要发布的Bundle依赖ws-util,但不需要依赖CXF,如果把CXF替换为其他的Webservice引擎,不会引起其他Bundle的变更。
Ø 编码方便
尽可能减少对业务代码的侵入。
2 思路
1, 如何实现动态发布?
需要发布的Bundle依赖ws-util,调用接口即可完成发布,所以不能在ws-util中静态配置webservice。
解决的办法是利用jax-ws 中定义EndPoint接口,对该接口包装成一个类并发布为OSGI Service,其他bundle调用该service完成webservice的发布。
2, ws-util的上下文环境是什么样的?
Project中存在WEB-INF目录,并且存在web.xml描述文件,osgi的tomcat bundle启动时会自动监视该目录并且加载该文件,并把ws-util作为war包部署到web容器中。
OSGI CORE启动时会监视METAINF.MF中的MANIFEST.MF文件,并初始化OSGI上下文,发布OSGI Service。所以ws-util处于双重的容器管理之下,一重是OSGI容器管理,一重是WEB容器管理。
Tomcat bundle也是由OSGI CORE启动,所以ws-util的OSGI上下文初始化要早于Web上下文的初始化,如果用META-INF/spring下的spring配置方式发布EndPoint包装接口,此时的CXF Bus还没有开始初始化,EndPoint找不到web server的provider,发布就不会成功。
3, 如何把tomcat和cxf整合起来?
1)注册Activator, 在activator初始化方法中获取osgi上下文。
2)web上下文加载CxfNoSpringServlet时,初始化cxf bus后,获取缓存中的osgi上下文,并且把EndPoint包装类注册为osgi 服务。
3 环境配置
JDK:1.6
Eclipse:3.5.2
Spring:3.0.6
CXF:2.3.1
3.1 OSGI PlatForm的依赖Bundle
Spring 相关Bundle |
org.springframework.beans-3.0.6.RELEASE.jar org.springframework.context.support-3.0.6.RELEASE.jar org.springframework.web-3.0.6.RELEASE.jar org.springframework.context-3.0.6.RELEASE.jar org.springframework.asm-3.0.6.RELEASE.jar org.springframework.expression-3.0.6.RELEASE.jar org.springframework.web.servlet-3.0.6.RELEASE.jar org.springframework.core-3.0.6.RELEASE.jar org.springframework.aspects-3.0.6.RELEASE.jar org.springframework.aop-3.0.6.RELEASE.jar org.springframework.oxm-3.0.6.RELEASE.jar |
Spring DM 相关Bundle |
org.eclipse.osgi.services_3.2.0.v20090520-1800.jar spring-osgi-core-2.0.0.M1.jar spring-osgi-extender-2.0.0.M1.jar spring-osgi-annotation-2.0.0.M1.jar spring-osgi-web-extender-2.0.0.M1.jar spring-osgi-io-2.0.0.M1.jar spring-osgi-web-2.0.0.M1.jar |
XML 相关Bundle |
com.springsource.org.apache.xml.serializer-2.7.1.jar com.springsource.javax.xml.ws-2.1.1.jar com.springsource.javax.xml.stream-1.0.1.jar com.springsource.javax.xml.bind-2.2.0.jar com.springsource.org.apache.xmlcommons-1.3.4.jar com.springsource.javax.xml.soap-1.3.0.jar com.springsource.org.apache.xml.resolver-1.2.0.jar com.springsource.org.dom4j-1.6.1.jar com.springsource.org.apache.xerces-2.9.1.jar |
其他依赖包 |
com.springsource.net.sf.cglib-2.2.0.jar com.springsource.javax.activation-1.1.1.jar javax.el-2.2.0.v201105051105.jar com.springsource.org.apache.commons.el-1.0.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.apache.commons.logging-1.1.1.jar |
Tomcat启动包 |
catalina.start.osgi-1.0.0.jar catalina.osgi-5.5.23-SNAPSHOT.jar |
所有这些Bundle可以在http://ebr.springsource.com/repository/app/ 网站下载。
4 创建Webservice Bundle
4.1 创建Plug-in project
4.2 Project 目录结构
目录说明如下:
SRC |
插件代码 |
Lib |
CXF 依赖包 |
META-INF |
OSGI工程的配置项 |
WEB-INF |
当前项目要发布到Web容器中,OSGI根据该目录的Web.xml确定部署方式 |
4.3 CXF依赖包
Webservice lib下面的jar都是来自于cxf,但是我们用不了所有的jar包,需要根据我们的需要剔除一部分。
我们需要把webservice发布到Tomcat中,并且以jax-ws的方式,可以从cxf的lib中剔除jetty和restful实现相关的jar包。
另外我们的OSGI platform中已经有web相关的bundle,所以servlet相关的jar也要剔除。
剩下的jar列表如下:
lib/cxf-2.3.1.jar, lib/cxf-wstx-msv-validation-2.3.1.jar, lib/cxf-xjc-boolean-2.3.0.jar, lib/cxf-xjc-bug671-2.3.0.jar, lib/cxf-xjc-dv-2.3.0.jar, lib/cxf-xjc-ts-2.3.0.jar, lib/msv-20050913.jar, lib/neethi-2.0.4.jar, lib/oro-2.0.8.jar, lib/stax2-api-3.0.2.jar, lib/velocity-1.6.4.jar, lib/woodstox-core-asl-4.0.8.jar, lib/wsdl4j-1.6.2.jar, lib/xmlbeans-2.4.0.jar, lib/XmlSchema-1.4.7.jar, lib/xmlsec-1.4.4.jar |
4.4 MANIFEST.MF添加需要import的package
javax.servlet, javax.servlet.http;version="2.5.0", javax.xml.ws, org.osgi.framework, org.osgi.util.tracker, org.springframework.beans;version="3.0.6.RELEASE", org.springframework.beans.factory;version="3.0.6.RELEASE", org.springframework.beans.factory.config;version="3.0.6.RELEASE", org.springframework.beans.factory.support;version="3.0.6.RELEASE", org.springframework.beans.factory.wiring;version="3.0.6.RELEASE", org.springframework.beans.factory.xml;version="3.0.6.RELEASE", org.springframework.context;version="3.0.6.RELEASE", org.springframework.context.event;version="3.0.6.RELEASE", org.springframework.context.support;version="3.0.6.RELEASE", org.springframework.core;version="3.0.6.RELEASE", org.springframework.core.io;version="3.0.6.RELEASE", org.springframework.core.io.support;version="3.0.6.RELEASE", org.springframework.osgi.context;version="2.0.0.M1", org.springframework.osgi.web.context.support;version="2.0.0.M1", org.springframework.web.context;version="3.0.6.RELEASE" |
导入结束后,会在project的plug-in Dependencies下出现下列bundle:
|
4.5 JAVA 源码说明
4.5.1 类结构
说明:
WSRegister |
EndPoint包装类接口 |
WSRegisterImpl |
包装接口实现类 |
CXFWrapperServlet |
CXFNoSpringServlet |
WsActivator |
OSGI启动类 |
ContextStore |
OSGI 上下文缓存 |
4.5.2 WSRegister
package com.boco.gutil.webservice.exports;
public interface WSRegister { public void regiser(Object impl,String address); } |
4.5.3 WSRegisterImpl
public class WSRegisterImpl implements WSRegister { private static final Logger logger = Logger.getLogger(WSRegisterImpl.class .getName());
public void regiser(final Object impl, final String address) { ClassLoader clsCl = this.getClass().getClassLoader(); Thread.currentThread().setContextClassLoader(clsCl);
logger.info(" Regiser Service @" + address);
Endpoint.publish(address, impl); } } |
4.5.4 ContextStore
public class ContextStore { private static BundleContext context = null;
public static BundleContext getContext() { return context; }
public static void setContext(BundleContext context) { ContextStore.context = context; } } |
4.5.5 WsActivator
public class WsActivator implements BundleActivator {
public void start(BundleContext context) throws Exception { ContextStore.setContext(context);
}
public void stop(BundleContext bc) throws Exception { ContextStore.setContext(null); }
} |
4.5.6 CXFWrapperServlet
public class CXFWrapperServlet extends CXFNonSpringServlet { private static final long serialVersionUID = -6994879522066465447L; private static final Logger logger = Logger.getLogger(CXFWrapperServlet.class .getName());
public void loadBus(ServletConfig servletConfig) throws ServletException { super.loadBus(servletConfig);
Bus bus = this.getBus();
BusFactory.setDefaultBus(bus);
BundleContext context = ContextStore.getContext();
Dictionary<String, String> props = new Hashtable<String, String>(); props.put("context-class-loader", "service-provider");
context.registerService(WSRegister.class.getName(), new WSRegisterImpl(), props); logger.info("Start Deploy com.boco.gutil.webservice"); } } |
4.5.7 Web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/spring/*.xml </param-value> </context-param> <context-param> <param-name>contextClass</param-name> <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>com.boco.gutil.webservice.context.CXFWrapperServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> |
4.5.8 MANIFEST.MF
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Webservice Bundle-SymbolicName: com.boco.gutil.webservice Bundle-Version: 1.0.0.qualifier Bundle-Vendor: BOCO Web-ContextPath: GDPP_WS Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: com.boco.gutil.webservice.exports, org.apache.cxf.frontend, org.apache.cxf.jaxws Bundle-ClassPath: ., lib/cxf-2.3.1.jar, lib/cxf-wstx-msv-validation-2.3.1.jar, lib/cxf-xjc-boolean-2.3.0.jar, lib/cxf-xjc-bug671-2.3.0.jar, lib/cxf-xjc-dv-2.3.0.jar, lib/cxf-xjc-ts-2.3.0.jar, lib/msv-20050913.jar, lib/neethi-2.0.4.jar, lib/oro-2.0.8.jar, lib/stax2-api-3.0.2.jar, lib/velocity-1.6.4.jar, lib/woodstox-core-asl-4.0.8.jar, lib/wsdl4j-1.6.2.jar, lib/xmlbeans-2.4.0.jar, lib/XmlSchema-1.4.7.jar, lib/xmlsec-1.4.4.jar Import-Package: javax.servlet, javax.servlet.http;version="2.5.0", javax.xml.ws, org.osgi.framework, org.osgi.util.tracker, org.springframework.beans;version="3.0.6.RELEASE", org.springframework.beans.factory;version="3.0.6.RELEASE", org.springframework.beans.factory.config;version="3.0.6.RELEASE", org.springframework.beans.factory.support;version="3.0.6.RELEASE", org.springframework.beans.factory.wiring;version="3.0.6.RELEASE", org.springframework.beans.factory.xml;version="3.0.6.RELEASE", org.springframework.context;version="3.0.6.RELEASE", org.springframework.context.event;version="3.0.6.RELEASE", org.springframework.context.support;version="3.0.6.RELEASE", org.springframework.core;version="3.0.6.RELEASE", org.springframework.core.io;version="3.0.6.RELEASE", org.springframework.core.io.support;version="3.0.6.RELEASE", org.springframework.osgi.context;version="2.0.0.M1", org.springframework.osgi.web.context.support;version="2.0.0.M1", org.springframework.web.context;version="3.0.6.RELEASE" Bundle-ActivationPolicy: lazy Bundle-Activator: com.boco.gutil.webservice.context.WsActivator |
其中:
Web-ContextPath: GDPP_WS
设置webservice的web 上下文路径。
Bundle-Activator: com.boco.gutil.webservice.context.WsActivator
设置ws-util osgi启动时触发器。
5 发布WebService(依赖ws-util的bundle)
5.1 创建ServiceTracker
public class WSRegisterTracker extends ServiceTracker { public WSRegisterTracker(BundleContext context) { super(context,WSRegister.class.getName(),null); }
public Object addingService(ServiceReference reference) { Object serviceObj = context.getService(reference); //注册webservice WSRegister wsRegister = (WSRegister)serviceObj; wsRegister.regiser(new HelloWorldImpl(), "/Hello");
return super.addingService(reference); } } |
5.2 创建Activator
public class WSClientActivator implements BundleActivator { private WSRegisterTracker tracker = null; public void start(BundleContext context) throws Exception { tracker = new WSRegisterTracker(context); tracker.open(); }
public void stop(BundleContext bundleContext) throws Exception { tracker.close(); } } |
5.3 接口,实现类和引用类
@WebService public interface IHelloWorld {
String sayHi(String text);
String sayHiToUser(User user);
}
@WebService public class HelloWorldImpl implements IHelloWorld { public String sayHi(String text) { System.out.println("sayHi called"); return "Hello " + text; }
public String sayHiToUser(User user) { System.out.println("sayHiToUser called"); return "Hello " + user.getName(); } }
public class User implements Serializable{ String name;
public User() { } public User(String s) { name = s; }
public String getName() { return name; }
public void setName(String s) { name = s; } } |
相关推荐
在Web服务环境中,Tomcat作为服务器,承载CXF和Spring构建的服务端应用。 **服务端**:在"testwebseviceserver"目录下,包含了服务端的代码和配置。服务端通常定义了Web服务的接口和实现,通过CXF提供的注解或者XML...
6. **发布Web服务**:在Tomcat上发布CXF Web服务,需要将包含CXF和Spring配置的WAR文件部署到Tomcat的webapps目录下。然后,Tomcat会自动加载并启动服务,使得其他客户端可以通过HTTP或HTTPS请求访问这些服务。 7. ...
1. **配置Spring上下文**:首先,我们需要创建一个Spring配置文件,例如`spring-cxf.xml`,在这个文件中,我们会定义CXF的bean,如`JaxWsServerFactoryBean`,用于创建和发布WebService服务。 2. **定义WebService...
本项目“cxf+spring发布webservice和restservice”专注于利用Apache CXF框架与Spring框架结合,实现这两种服务的发布。Apache CXF是一个开源的、功能丰富的服务栈,它使得开发者能够轻松地构建和部署SOAP和RESTful ...
本教程将深入探讨如何利用Apache CXF 2与Spring 2.5来构建和使用WebService。 首先,让我们理解这两个组件的基本概念。Apache CXF是一个全面的服务框架,它支持多种Web服务规范,如SOAP、RESTful、WS-*等。它提供了...
通过Spring的ApplicationContext配置,我们可以管理CXF服务的生命周期,实现服务的发布和消费。 2. **创建WebService**: 使用CXF,首先需要定义服务接口,通常是一个Java接口,然后提供其实现。Spring会自动扫描...
在本教程中,我们将深入探讨如何使用CXF在JBoss和Tomcat这两种流行的Java应用服务器上发布Web服务。 ### 一、CXF WebService发布 1. **CXF环境搭建** 在开始之前,确保你已经安装了Java Development Kit (JDK) 和...
4. **服务注册与发布**:使用Spring配置的`JAXWSServerFactoryBean`或`JAXRSServerFactoryBean`,将服务接口和实现绑定到特定的URL上,发布Web服务。 5. **客户端调用**:在需要消费Web服务的项目中,可以使用...
2. **自动扫描和发布**:在Spring配置中启用CXF的自动扫描功能,CXF会自动发现并发布实现服务接口的bean。 3. **Spring的WS配置**:使用Spring的`<jaxws:endpoint>`标签来声明式地配置Web服务,包括服务接口、实现...
9. **部署和运行**:一旦服务被配置好,你可以将应用打包成WAR或EAR文件部署在应用服务器上,如Tomcat、Jetty等。也可以使用Spring Boot简化部署,直接运行包含CXF和Spring的独立应用。 10. **持续集成和DevOps**:...
它将Apache CXF(一个用于构建和消费Web服务的开源框架)与Spring框架(一个广泛使用的Java企业级应用开发框架)以及Tomcat(一个流行的轻量级Java应用服务器)集成在一起。这个"helloWorld"例子是用来演示如何在...
**SpringBoot框架** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是简化Spring应用...这两个部分可以作为学习和实践SpringBoot发布和消费Web服务的起点,帮助开发者深入理解SpringBoot与CXF的协同工作方式。
Apache CXF是一个开源的服务框架,它允许开发者创建和消费各种不同类型的Web服务,而Spring则是一个广泛使用的Java企业级应用框架,它提供了强大的依赖注入和AOP(面向切面编程)功能。接下来,我们将深入探讨这两个...
SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验 ...通过本实验,我们可以学习到Spring Boot的自动配置和依赖管理功能、Mybatis的数据库操作功能和CXF的WebService开发功能。
在Spring应用上下文中启动后,Web服务就会在指定的地址上可用。可以使用CXF的客户端工具或自定义客户端代码来调用这个服务进行测试。 4. **扩展和优化**: - **安全配置**:可以通过Spring Security与CXF的集成来...
在本文中,我们将探讨如何使用Spring+CXF实现用户文件传输的Webservice。该Webservice提供了基本的报文上传和查询功能,同时还提供了用户身份验证功能。 Spring 和 CXF 集成 Apache CXF是一个开源的服务框架,帮助...
在IT行业中,Spring框架是Java企业级应用开发的首选,而CXF则是一个流行的Web服务框架,用于构建和消费Web服务。将Spring与CXF整合,可以充分利用Spring的依赖注入和管理能力,使得Web服务的开发、部署和测试更加...
这通常包括CXF的核心库、Spring的上下文和AOP支持库。 2. **创建Spring配置**:在Spring的XML配置文件中,你需要声明CXF的Servlet和Bus实例。Servlet将处理HTTP请求,而Bus是CXF的核心,负责管理服务和服务端点。 ...
在本文中,我们将探讨如何将Spring与Apache CXF框架整合,以发布RESTful风格的Web服务。RESTful Web服务是一种轻量级的架构风格,它基于HTTP协议,使用URI(Uniform Resource Identifier)来定位资源,通过HTTP方法...
这个项目提供了一个很好的示例,通过详细注释帮助开发者理解如何在SpringBoot应用中发布和调用Web服务。 1. **SpringBoot简介** SpringBoot简化了Spring应用程序的初始设置和配置,通过自动配置和“起步依赖”...