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

WebService之CXF篇

阅读更多

1. CXF相关的jar包可以去http://cxf.apache.org官方网站进行下载。

2. CXF用到的jar分别为:

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 跟spring集成cxf

   a. 创建一个针对cxf使用的applicationContext.xml文件,比如:appContext_cxf.xml

      内容为:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xmlns:jaxws="http://cxf.apache.org/jaxws" 

  xmlns:cxf="http://cxf.apache.org/core"

  xsi:schemaLocation="http://www.springframework.org/schema/beans 

    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

    http://cxf.apache.org/jaxws 

    http://cxf.apache.org/schemas/jaxws.xsd 

    http://cxf.apache.org/core 

    http://cxf.apache.org/schemas/core.xsd">

 

  <import resource="classpath:META-INF/cxf/cxf.xml" />

  <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

  <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

  <!-- 通过Spring创建数据绑定的类

    <bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" />

 

    <bean id="jaxWsServiceFactoryBean" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">

        <property name="wrapped" value="true" />

        <property name="dataBinding" ref="aegisBean" />

    </bean>-->

 

  <!-- jax-ws endpoint定义  -->

  <jaxws:endpoint address="/bulletinQuery">

    <jaxws:implementor ref="bulletinQueryWebService"  />

  </jaxws:endpoint>

 

  <!-- WebService的实现Bean定义 -->

  <bean id="bulletinQueryWebService" class="com.sinosoft.gb.ws.services.IWSBulletinQueryServiceImpl">

    <property name="bulletinMapper">

      <ref bean="bulletinMapper"/>

    </property>

  </bean>

</beans>

注:红色字体部分一定要注意必须引入和注明;蓝色部分为WebService访问时的地址;绿色部分为实现类中相关bean的调用。

b. web.xml中的配置:

<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/applicationContext.xml</param-value>

  </context-param>

<listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

  <!-- Spring 刷新Introspector防止内存泄露 -->  

    <listener>  

        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  

    </listener>  

<!-- CXF 配置   -->

    <servlet>  

        <servlet-name>CXFServlet</servlet-name>  

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

        <load-on-startup>2</load-on-startup>

    </servlet>  

    <servlet-mapping>  

        <servlet-name>CXFServlet</servlet-name>  

        <url-pattern>/cxfService/*</url-pattern>  

    </servlet-mapping>

 

c. spring配置文件

   将WebService配置使用的applicationContext.xml文件引入:

   <import resource="classpath:com/sinosoft/gb/ws/services/configs/appContext_*.xml"/><!-- 数据接口WebService的spring文件 -->

    注:红色部分以实际路径为准。

4. 服务端代码的编写:

   

package com.sinosoft.gb.ws.services;

 

import java.io.Serializable;

 

import javax.jws.WebParam;

import javax.jws.WebService;

/************************************************************

 * TODO: 简报信息查询接口

 * @author LiuLiang

 * @since 2012-04-25

 ************************************************************/

@WebService( name="bulletinQueryService",targetNamespace="http://www.sinosoft.com.cn/" )

public interface IWSBulletinQueryService extends Serializable

{

  public String getBulletinInfo( @WebParam( name="strXMLInfo" ) String strXMLInfo );

}

 

package com.sinosoft.gb.ws.services;

 

import javax.jws.WebMethod;

import javax.jws.WebService;

 

import org.apache.log4j.Logger;

 

import com.sinosoft.gb.bulletin.mappers.IBulletinMapper;

import com.sinosoft.gb.bulletin.pojo.CBulletinBean;

 

/************************************************************

 * TODO: 简报信息查询接口

 * @author LiuLiang

 * @since 2012-04-25

 ************************************************************/

@SuppressWarnings( "serial" )

@WebService( name="bulletinQueryService",

       serviceName="bulletinQueryService",

       portName="bulletinQueryServicePort",

       targetNamespace="http://www.sinosoft.com.cn/",

       endpointInterface="com.sinosoft.gb.ws.services.IWSBulletinQueryService")

public class IWSBulletinQueryServiceImpl implements IWSBulletinQueryService

{

  private static Logger mobjLogger = Logger.getLogger( IWSBulletinQueryServiceImpl.class.getName() );

  private IBulletinMapper bulletinMapper ;

  @WebMethod( operationName="getBulletinInfo" )

  public String getBulletinInfo(String strXMLInfo)

  {

    mobjLogger.info( "IWSBulletinQueryServiceImpl_getBulletinInfo(...)_通过WebService查询简报相关信息" );

    CBulletinBean objBull = this.getBulletinMapper().getBulletinById( 1719 );

    System.out.println( "webservice==="+objBull.getObjName() );

    return objBull.getObjName();

  }

  public IBulletinMapper getBulletinMapper()

  {

    return bulletinMapper;

  }

  public void setBulletinMapper(IBulletinMapper bulletinMapper)

  {

    this.bulletinMapper = bulletinMapper;

  }

 

}

注意:红色字体部分为需要注意的地方,相关配置请参阅官方详细说明。

5. 至此CXF与Spring的集成就结束了,运行项目后访问会看到: 

 

6. 项目中如果有struts2,还需要作如下修改:

    a. 将struts2(web.xml)的filter修改成自定义的filter:

      

<!-- 定义Struts2的FilterDispathcer的Filter -->

    <filter>

        <filter-name>struts2</filter-name>

        <!-- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  -->

        <filter-class>com.sinosoft.gb.filters.CStrutsCustomFilter</filter-class>

        <init-param>

           <param-name>excludeURI</param-name>

           <param-value>cxfService</param-value>

      </init-param>

    </filter>

  <!-- FilterDispatcher用来初始化struts2并且处理所有的WEB请求。 -->

  <filter-mapping>

        <filter-name>struts2</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

   b. 类为:

      

package com.sinosoft.gb.filters;

 

import java.io.IOException;

 

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

 

import org.apache.log4j.Logger;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

 /**

    * FilterDispatcher 在struts2新的版本中不再支持,建议使用StrutsPrepareAndExecuteFilter

    *

    */

/**

 * TODO: 自定义Struts2的过滤

 * @author LiuLiang

 *

 */

@SuppressWarnings("deprecation") 

public class CStrutsCustomFilter extends StrutsPrepareAndExecuteFilter

{

  private static Logger mobjLogger = Logger.getLogger( CStrutsCustomFilter.class.getName() );

  private static String strExcludeURI = "";

  public CStrutsCustomFilter()

  {

    super();

  }

 

  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,

      ServletException

  {

    HttpServletRequest request = (HttpServletRequest) req;

    String URI = request.getRequestURI();

    int nRet = URI.indexOf( strExcludeURI );

    if ( nRet > 0 )

    {

      chain.doFilter( req, res );

    }

    else

    {

      super.doFilter( req, res, chain );

    }

  }

  public void init(FilterConfig config) throws ServletException

  {

    mobjLogger.info( "CStrutsCustomFilter_获取Filter初始化值..." );

    super.init( config );

    strExcludeURI = config.getInitParameter( "excludeURI" );

  }

}

 7. 测试访问CXF-WebService

    1. 再server端访问配置如下:

      a. 填写client端的xml文件:

      

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">          

 

  <bean id="client" class="com.sinosoft.ws.server.service.IHello" 

      factory-bean="clientFactory" factory-method="create"/>

 

  <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">

    <property name="serviceClass" value="com.sinosoft.ws.server.service.IHello"/>

    <property name="address" value="http://192.168.90.12:7005/ws/hello"/>

  </bean>

</beans>

        b. 测试类为:

          

package com.sinosoft.ws.client.service;

 

import javax.xml.namespace.QName;

import javax.xml.ws.Service;

import javax.xml.ws.soap.SOAPBinding;

 

import com.sinosoft.ws.server.service.IHello;

 

public class HelloClient {

  // 两个参数分别是 web service的targetNamespace和name

  // 默认就是(http://+包名的倒装)和(类名),可以在@WebService()注解中设置

  // 最后有/的话不能忘了,一个字符也不能差

  private static final QName SERVICE_NAME = new QName("http://www.sinosoft.com.cn", "helloworld");

  // 这个是targetNamespace和name+"Port"

  private static final QName PORT_NAME = new QName("http://www.sinosoft.com.cn", "helloworldPort");

 

  private HelloClient() {

  }

 

  public static void main(String args[]) throws Exception {

    Service service = Service.create(SERVICE_NAME);

    // Endpoint Address

    // 这个只要前面对,后面多上一堆也可以,很是奇怪

    // 这样也行??http://localhost:9080/cxf-security/ws/hellosllooiehfkdjfajs

    String endpointAddress = "http://192.168.90.12:7005/ws/hello";

 

    // Add a port to the Service

    service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);

 

    IHello helloService = service.getPort(IHello.class);

 

    System.out.println(helloService.sayHello("World"));

  }

}

2. 单独测试的client

    a. 使用cxf包中自带的wsdl2java工具进行生成。将webservice的wsdl文件保存到本地,并命名为:xxx.wsdl或xxx.xml都可以;然后将保存的文件放到cxf包中的bin目录下;打开命令窗口并转到cxf-home/bin目录下,敲如下命令:

      wsdl2java -clicent xxx.wsdl/xxx.xml

      执行完毕后,会在目录下生成相应的目录及类。

   b. 新建一个web项目并将cxf使用的相关jar加入进来,然后将命令生成的相关文件拷贝到项目的src下,一般需要修改的文件为:*****_Service.java 将错误注释掉即可。然后通过******_Client.java进行访问即可。

 

补充:由于CXF总是在更新完善,如果你的项目使用的spring版本比较低的话,亦可以集成最新的CXF,把相关的lib放到项目中的lib目录中,按照上面所述配置完成后如果出现异常,首先检查是否是配置路径问题,其次是否是包冲突造成的。

包冲突造成的异常:

1.could not instantiate bean class [org.apache.cxf.bus.spring.SpringBus]: Constructor threw exception; nested exception is org.apache.cxf.bus.extension.ExtensionException: Could not load extension class org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl

  解决办法:这个错误的发生是因为与neethi.jar不兼容的版本。 CXF2.7.3以上期待neethi3.x.jar的。我在classpath中有neethi2.x.jar,所以去掉以前的就可以。

分享到:
评论

相关推荐

    简单的webservice+Cxf+Spring数据对接实例以及jar.rar

    简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar简单的webservice+Cxf+Spring数据对接实例以及jar.rar...

    webService(基于cxf)的完整例子

    例如,可以使用`@WebService`注解标记一个Java类为Web服务接口,并使用`@Path`注解来定义RESTful服务的URL路径。 4. **CXF服务部署**:CXF提供多种部署方式,包括独立服务器、Tomcat等应用服务器,以及Spring容器。...

    webservice-cxf-spring-jar.zip

    【标题】"webservice-cxf-spring-jar.zip" 是一个包含了使用Apache CXF与Spring框架集成开发Web服务的Java库集合。这个压缩包提供了一整套必要的JAR文件,以便于开发者在他们的项目中快速搭建和运行基于CXF的Web服务...

    SpringBoot开发WebService之CXF示例

    在本文中,我们将深入探讨如何使用SpringBoot集成Apache CXF来开发Web服务。SpringBoot以其简洁的配置和快速的应用启动而受到广大开发者的欢迎,而CXF是一个强大的开源框架,用于构建和消费Web服务。结合这两者,...

    WebService_CXF_x509

    【WebService_CXF_x509】是一个关于使用Apache CXF框架实现基于X.509数字证书的安全Web服务的主题。Apache CXF是一个流行的开源Java框架,用于构建和部署Web服务。X.509是一种标准格式,用于表示公钥基础设施(PKI)...

    WebService之CXF开发指南.doc

    WebService之CXF开发指南 该资源总结了WebService之CXF开发指南,涵盖了WebService的基本概念、SOA架构、CXF框架的介绍、CXF的功能特性、安装和目录结构等内容。 WebService基本概念 WebService是一个软件接口,...

    WebService CXF 对象传递 附

    **WebService CXF 对象传递详解** 在Web服务领域,CXF是一个非常重要的开源框架,它允许开发者创建和消费各种Web服务。CXF支持SOAP、RESTful等多种通信模式,并且能够处理复杂的对象传递,使得Web服务的数据交换...

    webservice_cxf Demo

    这个"webservice_cxf Demo"项目是一个基于 Apache CXF 的 Web 服务示例,旨在帮助开发者理解如何使用 CXF 来创建、部署和消费 Web 服务。在这个示例中,我们将探讨 CXF 的核心概念、工作流程以及如何通过它来实现...

    WebService之CXF(一、服务端的使用)

    **WebService之CXF服务端使用详解** 在信息技术领域,WebService是一种基于开放标准的,用于不同系统间进行数据交换的技术。Apache CXF是一个流行的开源框架,它使得开发和部署Web服务变得简单而高效。本篇文章将...

    WebService之CXF开发指南

    ### WebService之CXF开发指南 #### 一、概述 WebService技术已经成为企业级应用中不可或缺的一部分,它使得不同系统之间能够以标准化的方式进行交互。在众多WebService框架中,Apache CXF因其灵活、强大的功能和...

    webservice使用cxf的实例

    总的来说,"webservice使用cxf的实例"这个主题涵盖了从基础理论到实际操作的各个环节,包括CXF框架的使用、Web服务的创建与部署、客户端调用、数据绑定、安全性和Spring集成等多个方面。通过学习和实践,开发者可以...

    webservice之cxf实例

    【描述】:在这个“webservice之cxf实例”中,我们将深入学习Apache CXF框架在实现Web服务中的具体操作。首先,我们需要了解CXF的基本概念,它作为一个服务端和客户端的栈,支持多种协议和标准,包括SOAP、RESTful、...

    WebService之CXF开发指南.rar

    **WebService之CXF开发指南** 在IT行业中,WebService是一种基于开放标准(如WSDL、SOAP和UDDI)的通信协议,它允许不同系统之间进行互操作性交互。CXF,全称Apache CXF,是一个开源的Java框架,用于构建和开发高...

    WebService_CXF范例.

    【WebService CXF详解与入门】 WebService是一种允许不同系统之间进行通信和交互的标准协议,它基于HTTP协议,使得应用程序可以无视具体实现细节地调用互联网上的服务。这种技术使得分布式应用程序的发展成为可能,...

    WebService-CXF.ppt

    WebService-CXF.ppt

    WebService CXF 详细教程

    **WebService CXF 详解** **一、WebService简介** WebService是一种基于标准的,可以在不同操作系统、编程语言之间交换数据的Web应用程序。它通过WSDL(Web服务描述语言)定义了服务接口,利用SOAP(简单对象访问...

    一头扎进WebService之CXF Shiro Maven ActiveMq ExcelPOI FreeChart视频教程【4.5G】

    一头扎进WebService之CXF Shiro Maven Lucene ActiveMq ExcelPOI JFreeChart视频教程

    springBoot完整整合WebService框架CXF示例

    SpringBoot与CXF整合是构建基于Web服务的应用程序的一个常见实践。CXF是一个开源的Java框架,用于构建和开发服务导向架构(SOA)应用程序,它支持SOAP和RESTful服务。SpringBoot则简化了Spring应用的初始化和配置,...

    Webservice-CXF实用手册学习大全

    WebService-CXF实用手册学习大全的知识点涵盖了WebService技术的多个方面,主要分为以下几个部分: 1. WebService基础: - WebService是一种通过网络提供服务的技术,使用HTTP作为传输协议,SOAP作为消息格式,...

Global site tag (gtag.js) - Google Analytics