CXF的一些简单简介及用法

来源:互联网 发布:卸载软件需要密码 编辑:程序博客网 时间:2024/06/06 12:37

CXF 简介

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 将服务操作建模为方法调用,而将服务端口类型建模为接口。

示例应用程序

代码下载 部分提供了本系列之前文章中使用的简单的书库管理服务的一个版本,该版本经过了修改,以演示 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 文档。

构建和运行示例代码

在运行示例代码之前,首先需要下载并在系统上安装当前版本的 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 的区别。


下载资源


相关主题

  • Apache CXF:访问 CXF 站点,CXF 是一个来自 Apache Software Foundation 的开源 Web 服务堆栈。
  • Spring Framework:Spring 是多种开发的起点。
  • “使用 Spring 和 Apache CXF 设计和实现 POJO Web 服务,第 1 部分:使用 CXF 和 Spring 创建 Web 服务”(Rajeev Hathi 和 Naveen Balani,developerWorks,2008 年 7 月):本文展示了如何使用 CXF 通过 JAXB 和 JAX-WS 进行以 Java 为主的 Web 服务开发。
  • JAX-WS 参考实现:这是 JAX-WS 参考实现的主页。
  • developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。
  • CXF:下载 CXF。

原创粉丝点击