`
hazerscript
  • 浏览: 2412 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

应用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描述文件,osgitomcat bundle启动时会自动监视该目录并且加载该文件,并把ws-util作为war包部署到web容器中。

OSGI CORE启动时会监视METAINF.MF中的MANIFEST.MF文件,并初始化OSGI上下文,发布OSGI Service。所以ws-util处于双重的容器管理之下,一重是OSGI容器管理,一重是WEB容器管理。

Tomcat bundle也是由OSGI CORE启动,所以ws-utilOSGI上下文初始化要早于Web上下文的初始化,如果用META-INF/spring下的spring配置方式发布EndPoint包装接口,此时的CXF Bus还没有开始初始化,EndPoint找不到web serverprovider,发布就不会成功。

3,  如何把tomcatcxf整合起来?

       1)注册Activator, activator初始化方法中获取osgi上下文。

    2web上下文加载CxfNoSpringServlet时,初始化cxf bus后,获取缓存中的osgi上下文,并且把EndPoint包装类注册为osgi 服务。

 

3       环境配置

JDK1.6

Eclipse3.5.2

Spring3.0.6

CXF2.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的方式,可以从cxflib中剔除jettyrestful实现相关的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添加需要importpackage

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"

 

导入结束后,会在projectplug-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

设置webserviceweb 上下文路径。

Bundle-Activator: com.boco.gutil.webservice.context.WsActivator

设置ws-util osgi启动时触发器。

5       发布WebService(依赖ws-utilbundle

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;

    }

}

 

0
2
分享到:
评论

相关推荐

    Spring+CXF+tomcat开发webservice

    在Web服务环境中,Tomcat作为服务器,承载CXF和Spring构建的服务端应用。 **服务端**:在"testwebseviceserver"目录下,包含了服务端的代码和配置。服务端通常定义了Web服务的接口和实现,通过CXF提供的注解或者XML...

    CXF+Spring+Tomcat发布WebService

    6. **发布Web服务**:在Tomcat上发布CXF Web服务,需要将包含CXF和Spring配置的WAR文件部署到Tomcat的webapps目录下。然后,Tomcat会自动加载并启动服务,使得其他客户端可以通过HTTP或HTTPS请求访问这些服务。 7. ...

    Spring+CXF 发布WebService服务

    1. **配置Spring上下文**:首先,我们需要创建一个Spring配置文件,例如`spring-cxf.xml`,在这个文件中,我们会定义CXF的bean,如`JaxWsServerFactoryBean`,用于创建和发布WebService服务。 2. **定义WebService...

    cxf+spring发布webservice和restservice

    本项目“cxf+spring发布webservice和restservice”专注于利用Apache CXF框架与Spring框架结合,实现这两种服务的发布。Apache CXF是一个开源的、功能丰富的服务栈,它使得开发者能够轻松地构建和部署SOAP和RESTful ...

    Apache CXF2+Spring2.5轻松实现WebService

    本教程将深入探讨如何利用Apache CXF 2与Spring 2.5来构建和使用WebService。 首先,让我们理解这两个组件的基本概念。Apache CXF是一个全面的服务框架,它支持多种Web服务规范,如SOAP、RESTful、WS-*等。它提供了...

    spring+CXF实现WebService(http+https)

    通过Spring的ApplicationContext配置,我们可以管理CXF服务的生命周期,实现服务的发布和消费。 2. **创建WebService**: 使用CXF,首先需要定义服务接口,通常是一个Java接口,然后提供其实现。Spring会自动扫描...

    CXF发布WebService,jboss和tomcat都能发布

    在本教程中,我们将深入探讨如何使用CXF在JBoss和Tomcat这两种流行的Java应用服务器上发布Web服务。 ### 一、CXF WebService发布 1. **CXF环境搭建** 在开始之前,确保你已经安装了Java Development Kit (JDK) 和...

    cxf+spring实现webservice

    4. **服务注册与发布**:使用Spring配置的`JAXWSServerFactoryBean`或`JAXRSServerFactoryBean`,将服务接口和实现绑定到特定的URL上,发布Web服务。 5. **客户端调用**:在需要消费Web服务的项目中,可以使用...

    CXF框架发布webservice

    2. **自动扫描和发布**:在Spring配置中启用CXF的自动扫描功能,CXF会自动发现并发布实现服务接口的bean。 3. **Spring的WS配置**:使用Spring的`&lt;jaxws:endpoint&gt;`标签来声明式地配置Web服务,包括服务接口、实现...

    cxf+spring=webservice CXF 应用开发

    9. **部署和运行**:一旦服务被配置好,你可以将应用打包成WAR或EAR文件部署在应用服务器上,如Tomcat、Jetty等。也可以使用Spring Boot简化部署,直接运行包含CXF和Spring的独立应用。 10. **持续集成和DevOps**:...

    cxf+spring+tomcat

    它将Apache CXF(一个用于构建和消费Web服务的开源框架)与Spring框架(一个广泛使用的Java企业级应用开发框架)以及Tomcat(一个流行的轻量级Java应用服务器)集成在一起。这个"helloWorld"例子是用来演示如何在...

    SpringBoot框架及CXF发布WebService

    **SpringBoot框架** SpringBoot是由Pivotal团队提供的全新框架,其设计目标是简化Spring应用...这两个部分可以作为学习和实践SpringBoot发布和消费Web服务的起点,帮助开发者深入理解SpringBoot与CXF的协同工作方式。

    Spring + CXF + 注解方式(webService)

    Apache CXF是一个开源的服务框架,它允许开发者创建和消费各种不同类型的Web服务,而Spring则是一个广泛使用的Java企业级应用框架,它提供了强大的依赖注入和AOP(面向切面编程)功能。接下来,我们将深入探讨这两个...

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验 ...通过本实验,我们可以学习到Spring Boot的自动配置和依赖管理功能、Mybatis的数据库操作功能和CXF的WebService开发功能。

    CXF和Spring搭建webservice代码

    在Spring应用上下文中启动后,Web服务就会在指定的地址上可用。可以使用CXF的客户端工具或自定义客户端代码来调用这个服务进行测试。 4. **扩展和优化**: - **安全配置**:可以通过Spring Security与CXF的集成来...

    基于spring+cxf实现用户文件传输的webservice

    在本文中,我们将探讨如何使用Spring+CXF实现用户文件传输的Webservice。该Webservice提供了基本的报文上传和查询功能,同时还提供了用户身份验证功能。 Spring 和 CXF 集成 Apache CXF是一个开源的服务框架,帮助...

    Spring整合CXF步骤,Spring实现webService,spring整合WebService

    在IT行业中,Spring框架是Java企业级应用开发的首选,而CXF则是一个流行的Web服务框架,用于构建和消费Web服务。将Spring与CXF整合,可以充分利用Spring的依赖注入和管理能力,使得Web服务的开发、部署和测试更加...

    cxf集成Spring的restful WebService接口

    这通常包括CXF的核心库、Spring的上下文和AOP支持库。 2. **创建Spring配置**:在Spring的XML配置文件中,你需要声明CXF的Servlet和Bus实例。Servlet将处理HTTP请求,而Bus是CXF的核心,负责管理服务和服务端点。 ...

    Spring整合CXF,发布RSETful 风格WebService

    在本文中,我们将探讨如何将Spring与Apache CXF框架整合,以发布RESTful风格的Web服务。RESTful Web服务是一种轻量级的架构风格,它基于HTTP协议,使用URI(Uniform Resource Identifier)来定位资源,通过HTTP方法...

    springboot整合CXF发布webservice和客户端调用

    这个项目提供了一个很好的示例,通过详细注释帮助开发者理解如何在SpringBoot应用中发布和调用Web服务。 1. **SpringBoot简介** SpringBoot简化了Spring应用程序的初始设置和配置,通过自动配置和“起步依赖”...

Global site tag (gtag.js) - Google Analytics