`

CXF 简介

    博客分类:
  • SOA
阅读更多

Apache CXF Web 服务堆栈是来自 Apache Software Foundation 的另一替代选择,Axis2 堆栈也来自同一组织。尽管它们来自同一组织,Axis 2 和 CXF 就如何配置和交付 Web 服务采用完全不同的方法。在本文中,您将学习为 CXF Web 服务使用 JAXB 2.x 和 JAX-WS 2.x 的基础,还将比较 CXF 与其他 JAXB/JAX-WS 堆栈 — Axis2 和 Metro — 这两个堆栈在之前的文章中讨论过。

CXF 基础比较

在用户界面方面,CXF 与 Axis2 和 Metro Web 服务堆栈有很多共同之处。三个堆栈都允许要么从已有 Java™ 代码开始构建 Web 服务,要么从 WSDL Web 服务描述开始,生成使用或实现服务的 Java 代码。而且与其他堆栈一样,CXF 将服务操作建模为方法调用,而将服务端口类型建模为接口。

与 Axis2 类似,但是不同于 Metro,CXF 允许选择不同的数据绑定技术。CXF 对 JAXB 2.x 的支持与 Metro 同等而高于 Axis2,因为它允许从 WSDL 生成代码时使用 JAXB 标准(而 Axis2 不允许)。CXF 还允许使用其他数据绑定方法,不过对这些方法的支持不像在 Axis2 中那样成熟 — 特别是,只有在使用 JAXB 或 XMLBeans 数据绑定时才能使用 CXF 从 WSDL 生成代码。

CXF 使用的首选服务配置技术(或在 CXF 术语中称为前端 ) 是 JAX-WS 2.x 注释,通常附有 XML 配置文件。CXF 中对 JAX-WS 注释的支持与 Metro 同等,因而与 Axis2(在 Axis2 中使用 JAX-WS 时存在一些限制,正如 “Axis2 中的 JAXB 和 JAX-WS ” 所述)相比,CXF 更适合使用 JAX-WS。与其他 JAX-WS 实现一样,CXF 需要服务 WSDL 在运行时可用于客户机。

同其他堆栈一样,CXF 使用由可配置组件组成的请求和响应处理流。CXF 调用组件 intercepters ,而非 handlers , 不过除此以外的其他组件是等效组件。与 Metro 相同的是,CXF 完全支持 WS-Security 和其他扩展技术,将其作为基础下载的一部分。与 Metro 不同的是,CXF JARs 是模块化的 — 即您可以根据正在使用的技术选择 JARs 使其成为应用程序的一部分(CXF 安装目录中的 /lib/WHICH_JARS 文件会告诉您各种常见用例所需的特定 JARs)。该模块化的负面效应是最终会产生应用程序所需的一长列特定 JARs;从有利的一面来说,它允许控制部署的大小。

另一个与 Metro 的相同之处是,CXF 通常需要为 Web 服务构建一个 WAR 文件,而非潜在地部署多个服务到单个服务安装上(这正是 Axis2 所用的方法)。CXF 还以 Jetty 服务器的形式提供一个适合生产使用的集成 HTTP 服务器。与 Axis2 和 Metro 中集成的简单服务器支持相比,这可以提供一个更灵活、强大的替代选择。

示例应用程序

代码下载 部分提供了本系列之前文章中使用的简单的书库管理服务的一个版本,该版本经过了修改,以演示 CXF 的使用。和之前的版本一样,WSDL 服务定义一共定义 4 个操作:

  • getBook 用于获取 International Standard Book Number (ISBN) 标识的特定图书的详细信息。
  • getBooksByType 用于获取某种类型的所有图书的详细信息。
  • getTypes 用于发现现有的图书类型。
  • addBook 用于将新的图书添加到书库。

在 “Axis2 中的 JAXB 和 JAX-WS ” 中,您看到了这个应用程序在 Axis2 中如何工作,然后在 “Metro 简介 ” 中,您看到了它如何在 Metro 中工作。 这几篇文章中的大部分内容也适用于使用 CXF 的情况。除了服务名称和端点地址不同外,WSDL 是相同的;生成的 JAXB 数据模型是相同的,甚至生成的服务类也是相同的,只是 Java 包和 JAX-WS 注释中使用的服务名称不同。

客户端的使用

与在 Axis2 或 Metro 中使用 JAX-WS 相比,在 CXF 中,示例应用程序的客户端代码是相同的,甚至构建步骤也是类似的:只需代替 JAX-WS 参考实现 wsimport 工具使用 CXF wsdl2java 工具即可。参阅 “Axis2 中的 JAXB 和 JAX-WS ” 了解代码和处理的详细信息。

尽管客户端代码相同,不过 CXF 中的客户端行为仍然有一个显著差异。默认情况下,CXF 打印大量令人不悦的日志细节并输出到控制台。CXF 使用 Java 日志记录,因此为避免此输出,您需要设置一个系统属性使其指向一个日志属性文件,设置为仅在有 WARNINGSEVERE 信息时输出日志。示例应用程序所用的 Ant build.xml 使用 JVM 参数行 <jvmarg value="-Djava.util.logging.config.file=${build-dir}/logging.properties"/> 完成这个设置。

服务器端的使用

与在 Axis2 或 Metro 中使用 JAX-WS 相比,在 CXF 中,示例应用程序的客户端代码也是一样的,且构建步骤与 Metro 很相似。使用 Axis2 时,是通过创建一个包含服务和数据模型类的 JAR 文件来准备用于部署的服务,然后通过将该 JAR 拖放到 Axis2 服务器安装目录中的 WEB-INF/servicejars 目录中来部署服务。而当使用 Metro 和 CXF 时,则需要创建一个包含服务和数据模型类、Metro 或 CXF 库 JARs 以及一对配置文件(其中一个文件在这两个堆栈中名称不同)的 WAR 文件。WEB-INF/web.xml 文件配置真正的 servlet 处理。用于示例应用程序的版本如 清单 1 所示:


清单 1. 示例应用程序 web.xml

				
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
  <display-name>CXFLibrary</display-name>
  <description>CXF Library Service</description>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:META-INF/cxf/cxf.xml
      classpath:META-INF/cxf/cxf-extension-soap.xml
      classpath:META-INF/cxf/cxf-servlet.xml
     </param-value>
  </context-param>
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

 

清单 1 WEB-INF/web.xml 文件正是一个标准 servlet 配置文件,它告诉 Web 应用程序服务器(比如 Tomcat)如何接口到 servlet 应用程序。详情与 Metro 示例中的那些细节一样,不过对于 CXF,<servlet-class> 是 CXF 代码的一部分而 <listener-class> 引用一个 Spring Framework 类 (参阅 参考资料 )。与 Metro 示例一样,servlet 被配置为接收所有传入该 Web 应用程序的请求(通过 <url-pattern>/</url-pattern> 条目)。

一个独立文件 WEB-INF/cxf-servlet.xml 用于配置 CXF,使其将 servlet 接收的请求路由到服务实现代码并按需提供服务 WSDL。该文件如 清单 2 所示:


清单 2. 示例应用程序 cxf-servlet.xml

				
<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:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
         http://cxf.apache.org/jaxws
         http://cxf.apache.org/schemas/jaxws.xsd">

    <jaxws:endpoint
        id="Processor"
        implementor="com.sosnoski.ws.library.cxf.CXFLibraryImpl"
        wsdlLocation="WEB-INF/wsdl/library.wsdl"
        address="/">
    </jaxws:endpoint>
</beans>

 

清单 2 WEB-INF/cxf-servlet.xml 文件只有一个端点定义,其中包括一个实现类、请求的匹配模式以及 WSDL 文档位置。WSDL 文档位置是这个端点定义中惟一的可选项。如果在 cxf-servlet.xml 文件中不指定服务端点的 WSDL 文档,CXF 会在运行时基于 JAX-WS 注释自动生成一个 WSDL 文档。

构建和运行示例代码

捆绑带来的问题

从 Java SE 6 开始,JAXB 2.x 和 JAX-WS 2.x 参考实现运行时(除了供应商扩展)成为标准 Java Runtime Environment (JRE) 库的一部分。其本意是鼓励将这些技术作为 Java 标准使用,但是这也带来一个副作用:为了使用这些技术的更新的版本,可能需要更改 JRE 的安装。

示例应用程序下载文件中使用的 build.xml 将所需的 CXF JAR 文件直接复制到服务 WAR 文件。使用 Java SE 5 构建时,这包括 JAXB 和 JAX-WS JARs;当使用 Java SE 6 构建时,构建依赖于 JVM 安装中 JAXB 和 JAX-WS 的版本。使用 Java SE 6 或更高版本时,如果类装载冲突在 JAXB 或 JAX-WS 代码内产生问题,检查一下您正在使用的 CXF 发行版是否有任何 JVM 兼容性说明。

在运行示例代码之前,首先需要下载并在系统上安装当前版本的 Metro(参阅 参考资料 )。示例代码经过 2.2.5 版的测试。另外还需要对解压的示例代码根目录中的 build.properties 文件进行编辑,将 cxf-home 属性的值改为 CXF 安装目录的路径。如果要使用不同的系统或端口上的服务器进行测试,那么需要更改 host-namehost-port

要使用所提供的 Ant build.xml 构建示例应用程序,打开一个控制台,进入下载文件的根目录,输入 ant 。这将首先调用 CXF wsdl2java 工具(包括在 CXF 中),然后编译客户端和服务器,最后将服务器代码打包为 WAR。接着可以将生成的 cxf-library.war 文件部署到测试服务器,并在控制台输入 ant run 尝试运行示例客户端。示例客户端运行,经过一系列对服务器的请求,打印出每个请求的简要结果。正如在 客户端的使用 中所提到的,构建过程会配置 CXF 日志记录,以避免运行示例客户端时打印配置细节。

CXF 中的 Spring

注意在 清单 2 cxf-servlet.xml 配置文件中 Spring Framework bean 配置的使用。您可能知道,Spring 是一种开源应用程序框架,它包括许多可用来装配应用程序的组件库。Inversion of Control (IoC) 是 Spring Framework 的原始基础,它允许链接和配置 JavaBean 类型的软件组件,在运行时使用 Java 映像访问 bean 对象的属性。

Spring IoC 容器通常为依赖性信息使用 XML 文件,清单 2 中的 cxf-servlet.xml 文件就是这种 Spring 配置的一个示例。<beans> 元素仅是单个 bean 配置的一个包装器。<jaxws:endpoint> 元素就是这样的一个 bean,CXF 通过特定类型的对象(一个 org.apache.cxf.jaxws.EndpointImpl 实例)与其相关联。

除了这个简单示例中使用的选项之外,还可以指定很多其他选项,包括服务的消息流配置。参阅 CXF 文档中的 JAX-WS 配置信息了解完整细节(Frontends/JAX-WS 目录下)。

除了 JAX-WS 注释之外,Spring 还用于 CXF 堆栈的所有配置,包括 CXF 内部消息流的组织。大部分时候,这些配置细节都通过使用直接包含在 CXF JARs 中的 XML 配置得到自动处理,(参阅 清单 1 web.xml 文件中的 contextConfigLocation 参数值,了解如何引用它们),不过可以使用自己的配置文件覆盖或添加到公共流。本系列文章不直接介绍这方面内容;您可以参阅 CXF 文档了解详细信息。

 

CXF 展望

本文介绍了 CXF Web 服务堆栈使用 JAXB 2.x 数据绑定和对 JAX-WS 2.x 注释进行配置的基础知识。之前的文章中 Axis2 和 Metro 堆栈使用的 JAXB/JAX-WS 代码在 CXF 中也可以使用,只是构建过程有些许修改且使用的部署配置文件有所不同。这种跨堆栈兼容性是使用 JAXB 和 JAX-WS 的主要优点,因为这便于在不同的堆栈之间切换。

CXF 的功能比这个简单示例显示的要多很多,在后面的文章中您将了解到其他一些特性。下一篇文章将着眼于 WS-Security 的使用,您将看到 CXF 实现与 Axis2 和 Metro 的区别。

 

下载

描述 名字 大小 下载方法
本文源代码 j-jws12.zip 16KB HTTP

 

原文:http://www.ibm.com/developerworks/cn/java/j-jws12.html

分享到:
评论

相关推荐

    CXF简介与功能

    CXF采用的是Spring2.0提供的一个新接口就是扩展的NamespaceHandler。通过注册相关的NamespaceHandler以及xsd,在Spring处理到对应Namespace下的XML元素时将会调用NamespaceHandler中注册的Parser来进行处理。

    Cxf例子Cxf例子我自己写的

    1. **CXF简介**:Apache CXF是一个开放源码的Web服务框架,它提供了一套工具和服务接口,使得开发者可以创建和实现基于WS-*标准的Web服务。CXF支持多种协议,如HTTP、HTTPS、FTP,以及各种消息格式,如SOAP、RESTful...

    CXF视频:1、使用CXF实现简单的HelloWorld

    1. **CXF简介**:首先,讲解者会介绍CXF的基本概念,包括它的功能、用途以及在Web服务开发中的重要性。 2. **环境准备**:设置开发环境,包括安装JDK、集成开发环境(IDE),以及添加CXF库到项目构建路径。 3. **...

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

    2. **Apache CXF简介** Apache CXF是一个开源的Web服务框架,支持SOAP、RESTful等不同风格的服务。它允许开发者以Java注解或XML方式定义服务接口,并提供了丰富的客户端和服务端工具。 3. **整合过程** - 首先,...

    CXF SOAP应用实例

    2. **CXF简介** CXF提供了一套全面的工具和服务,包括代码生成器、WSDL到Java绑定、Java到WSDL绑定、SOAP消息处理和安全支持等。它的优势在于对WS-I兼容性、强大的错误处理和调试能力。 3. **创建SOAP服务** 使用...

    WebService CXF 对象传递 附

    1. **CXF简介** CXF(Code first eXtended Framework)是一个Java Web服务框架,它提供了从Java类创建Web服务以及从WSDL创建Java服务端点的能力。CXF支持WS-*标准,包括SOAP、WS-Security等,同时提供了与JAX-RS...

    CXF入门 -- 第一个简单webService

    1. **CXF简介** CXF全称CXF CXF (Common eXtensible Framework),它支持多种服务标准,如SOAP、RESTful、JAX-WS、JAX-RS等。CXF不仅提供了服务端的实现,还提供了客户端调用服务的API,使得开发和调试Web服务变得...

    CXF Spring Web Service 程序

    CXF简介 CXF,全称CXF CXF,是 Continued eXtension Framework 的缩写,它的前身是XFire和Celtix两个项目。CXF不仅支持SOAP协议,还支持RESTful风格的服务,使得开发者可以灵活地选择服务实现方式。CXF通过提供...

    CXF实现WebService详解实例

    **一、CXF简介** Apache CXF是一个强大的开源工具,它提供了多种方式来创建和使用Web服务,包括SOAP、RESTful API、XML以及JSON等。CXF支持WS-*规范,如WS-Security、WS-ReliableMessaging等,使开发者可以构建高度...

    cxf WebService

    1. **CXF简介**:CXF最初由两个独立的项目Axiom和XFire合并而成,它提供了一个统一的API来处理SOAP和REST服务,降低了开发者在两者之间切换的难度。CXF支持WSDL(Web Service Definition Language)优先和Java优先两...

    cxf框架实现webservice调用demo

    1. **CXF简介**: CXF全称CXF Commons eXtensible Framework,它是一个轻量级的、基于Java的Web服务框架,支持多种协议和绑定,如SOAP、REST、XML/HTTP、JSON等。CXF集成了多种Web服务标准,如JAX-WS(Java API for...

    cxf开发教程

    1. **Apache CXF简介**:Apache CXF是一个开放源码的服务框架,它支持多种协议和服务模型,如SOAP、RESTful、WS-*等。CXF允许开发者以Java SE或Java EE环境来创建Web服务,并提供了丰富的API和工具,简化了开发过程...

    apache-cxf-3.2.2

    1. **CXF简介**:CXF( formerly XFire)是一个融合多种Web服务技术的框架,它的名字来源于两个主要组件——XFire和Celtix的合并。它不仅支持SOAP,还支持RESTful风格的服务,使得开发者可以根据项目需求选择合适的...

    CXF Restful服务简单例子

    \n\n一、CXF简介\nApache CXF是一个强大的Java框架,提供了一种灵活的方式来构建和部署Web服务。它支持多种Web服务规范,包括SOAP、WS-*以及RESTful。CXF提供了丰富的API和工具,使得开发者能够轻松地创建服务端和...

    apache-cxf-2.5.9

    1. **Apache CXF简介** Apache CXF是一个强大的Web服务框架,它允许开发者创建符合WS-*标准的SOAP Web服务和RESTful服务。CXF提供了一种统一的方式来处理不同类型的Web服务,包括基于JAX-WS和JAX-RS的API。 2. **...

    SpringBoot开发WebService之CXF示例

    2. **Apache CXF简介** Apache CXF是一个开源的Java Web服务框架,它支持多种Web服务标准,如SOAP、RESTful API、WS-*等。CXF提供了丰富的API和工具,使开发者能够轻松地创建和消费Web服务,无论是基于JAX-WS还是...

    非常详细的cxf开发学习教程集合

    1. **CXF简介**:首先,你需要理解CXF的基本概念,它是如何作为服务提供者和服务消费者的,以及它在Java世界中的地位。 CXF支持多种Web服务标准,如SOAP、RESTful、WS-*等。 2. **安装与配置**:学习如何在你的开发...

    cxf 开发webservice客户端

    一、CXF简介 CXF全称CXF CXF (Continued eXtensible Framework),它是一个Java框架,提供了创建和消费Web服务的能力。CXF支持WS-*标准,如WS-Security、WS-ReliableMessaging等,并且对RESTful API的构建也十分友好...

    Cxf应用整理学习资料

    #### 一、CXF简介与HelloWorld示例 Apache CXF是一个开源的框架,用于构建和消费基于SOAP、XML、REST等协议的Web服务。CXF支持JAX-WS和JAX-RS标准,为Java开发人员提供了丰富的API,使得开发Web服务变得更加简单。 ...

    CXF_Spring

    **Apache CXF简介** Apache CXF是一个全面的服务开发框架,它支持多种协议和服务模型,如SOAP、REST、WS-*规范等。CXF允许开发者通过简单的API来创建和暴露Web服务,同时也能作为客户端来调用远程服务。其强大的功能...

Global site tag (gtag.js) - Google Analytics