CXF是来自Apache Software Foundation的另一个Web服务堆栈,位于Axis2堆栈之后。 尽管它们来自同一组织,但Axis 2和CXF在配置和交付Web服务时采用了截然不同的方法。 在本文中,您将学习将JAXB 2.x和JAX-WS 2.x用于Web服务与CXF一起使用的基础知识,并且将看到CXF与其他JAXB / JAX-WS堆栈(Axis2和地铁-在先前的文章中讨论过。
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术语中的frontend )是通常由XML配置文件补充的JAX-WS 2.x注释。 CXF中对JAX-WS批注的支持与Metro相当,因此它比Axis2更适合JAX-WS的使用(如Axis2中的JAXB和JAX-WS所述,在使用JAX-WS方面存在一些主要限制) )。 与其他JAX-WS实现一样,CXF要求服务WSDL在运行时可供客户端使用。
与其他堆栈一样,CXF使用由可配置组件组成的请求和响应处理流。 CXF调用组件拦截器 ,而不是处理程序 ,但是除这些术语外,它们是等效的组件。 与Metro一样,CXF作为基本下载的一部分完整地支持WS-Security和其他扩展技术。 与Metro不同,CXF JAR是模块化的,这意味着您可以根据所使用的技术来选择要包含在应用程序中的JAR(CXF安装中的/ lib / WHICH_JARS文件会告诉您各种常用的JAR。用例)。 这种模块化的缺点是,您最终可能会获得一长串应用程序所需的特定JAR列表。 从好的方面来说,它使您可以减小部署的规模。
同样类似于Metro,CXF通常要求您为Web服务构建WAR文件,而不是将潜在的许多服务部署到单个服务器安装中(与Axis2一起使用的方法)。 CXF还以Jetty服务器的形式提供了一个适合生产使用的集成HTTP服务器。 与Axis2和Metro中集成的简单HTTP服务器支持相比,这为您提供了更加灵活和强大的替代方案。
样品申请
该代码下载提供了本系列以前的文章中使用的简单库管理服务的版本。 修改这一示例以演示CXF的用法。 与早期版本一样,WSDL服务定义定义了四个操作:
-
getBook
检索由国际标准书号(ISBN)标识的特定书的详细信息。 -
getBooksByType
检索特定类型的所有书籍的详细信息。 -
getTypes
查找可用的书籍类型。 -
addBook
将addBook
添加到库中。
在“ Axis2中的JAXB和JAX-WS”中 ,您了解了该应用程序在Axis2中的工作方式,然后在“ Introducing Metro ”中,您在Metro中对其进行了了解。 早期文章中的大多数讨论也适用于使用CXF。 除了服务名称和端点地址外,WSDL相同。 生成的JAXB数据模型是相同的,甚至生成的服务类也相同,除了Java包和JAX-WS批注中使用的服务名称。
客户端使用
CXF上的示例应用程序的客户端代码与在Axis2或Metro上使用JAX-WS相同,并且构建步骤非常相似:只需使用CXF wsdl2java工具代替JAX-WS参考实现wsimport工具。 有关代码和处理的详细信息,请参见“ Axis2中的JAXB和JAX-WS ”。
尽管客户端代码相同,但是CXF的客户端行为存在一个显着差异。 默认情况下,CXF将令人讨厌的日志详细信息打印到控制台。 CXF使用Java日志记录,因此,为避免出现此输出,您需要将系统属性设置为指向日志记录属性文件,并且将其设置更改为仅输出WARNING
或SEVERE
信息。 示例应用程序的Ant build.xml使用JVM参数行<jvmarg value="-Djava.util.logging.config.file=${build-dir}/logging.properties"/>
。
服务器端使用
CXF上的示例应用程序的服务器端代码也与在Axis2或Metro上使用JAX-WS相同,并且构建过程与Metro非常相似。 使用Axis2,您可以通过创建包含服务和数据模型类的JAR文件来准备部署服务,然后通过将该JAR放到Axis2服务器安装中的WEB-INF / servicejars目录中来部署服务。 使用Metro和CXF,您需要创建一个WAR文件,其中包含服务和数据模型类,Metro或CXF库JAR和一对配置文件(其中两个堆栈中的一个文件的名称不同)。 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应用程序接口。 细节类似于那些在新城例如,尽管对于CXF的<servlet-class>
是CXF码和的一部分<listener-class>
引用一Spring框架类(请参阅相关主题 )。 与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。
构建并运行示例代码
在尝试示例代码之前,您需要在系统上下载并安装最新版本的CXF(请参阅参考资料 )。 示例代码已在2.2.5版本中进行了测试。 您还需要在解压缩的样本代码下载的根目录中编辑build.properties文件,以将cxf-home
属性的值更改为CXF安装的路径。 如果要在其他系统或端口上的服务器上进行测试,则可能需要更改host-name
和host-port
。
要使用提供的Ant build.xml构建示例应用程序,请打开控制台到下载代码的根目录,然后键入ant
。 这将首先调用CXF wsdl2java
工具(包含在CXF发行版中),然后编译客户端和服务器,最后将服务器代码打包为WAR。 然后,您可以将生成的cxf-library.war文件部署到测试服务器,最后在控制台上键入ant run
来尝试运行示例客户端。 样本客户端通过对服务器的一系列请求序列,为每个请求打印简要结果。 如客户端使用中所述 ,该版本配置CXF日志记录,以避免在运行示例客户端时打印配置详细信息。
CXF的春天
注意清单2 cxf-servlet.xml配置文件中Spring Framework bean配置的使用。 您可能知道,Spring是一个开放源代码应用程序框架,其中包含许多可用于组装应用程序的组件库。 控制反转(IoC)容器是Spring框架的原始基础。 它允许您链接和配置JavaBean风格的软件组件,使用Java反射在运行时访问bean对象的属性。
Spring IoC容器通常使用XML文件获取依赖项信息, 清单2中的cxf-servlet.xml文件就是这种Spring配置的示例。 <beans>
元素只是单个bean配置的包装。 <jaxws:endpoint>
元素就是这样一个bean,CXF将其与特定类型的对象( org.apache.cxf.jaxws.EndpointImpl
实例)相关联。
除了在此简单示例中使用的选项外,您还可以在cxf-servlet.xml文件中指定许多其他选项,包括服务的消息流配置。 有关完整的详细信息,请参见CXF文档中的JAX-WS配置信息(在Frontends / JAX-WS下)。
除了JAX-WS批注之外,Spring还用于CXF堆栈的所有配置,包括CXF内部的消息流的组织。 在大多数情况下,这些配置详细信息是使用直接包含在CXF JAR中的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的比较。
翻译自: https://www.ibm.com/developerworks/java/library/j-jws12/index.html