Metro Web服务堆栈是由Sun Microsystems开发的开源工具。 它合并了JAXB 2.x数据绑定和JAX-WS 2.x Web服务标准的参考实现,以及其他与XML相关的Java标准。 Metro还包括添加的非标准组件,以支持基本的JAX-WS服务定义和用法,以及各种SOAP消息交换的WS- *扩展。
关于本系列
Web服务是Java技术在企业计算中的重要角色。 在本系列文章中,XML和Web服务顾问Dennis Sosnoski涵盖了对使用Web服务的Java开发人员很重要的主要框架和技术。 跟随该系列文章以了解该领域的最新进展,并了解如何使用它们来帮助您的编程项目。
Metro可以用作独立的Web服务堆栈,也可以用作开源Glassfish应用程序服务器中的集成组件。 使用Glassfish时,Web服务配置稍微容易一些,尤其是在开源NetBeans IDE上进行开发时,该NetBeans IDE包括用于配置基本Web服务和WS- *扩展的GUI工具。 为了保持对Web服务的关注,本系列仅以独立于IDE的方式着眼于Metro的独立使用,就像之前的文章讨论了Apache Axis2的独立使用,而不是结合了Axis2和支持GUI工具的应用程序服务器一样。 。
Metro基础知识与Axis2
本系列中的前几篇文章深入介绍了Axis2,因此,讨论Metro和Axis2之间的异同是一个不错的起点。 相似性是有限的,并且主要围绕使用Web服务开发代码的共同要求。 这两个框架都允许您从现有的Java代码开始并构建Web服务(尽管在Axis2的情况下,除非您使用单独的工具,例如Jibx2Wsdl,否则对该方法的支持是有限的),或者从WSDL Web服务描述开始。生成Java代码以使用或实现服务。 两个框架都将服务操作建模为方法调用,并将服务端口类型建模为接口。
Metro和Axis2之间的差异比相似之处更为明显。 从根本上讲,Metro是围绕JAXB 2.x和JAX-WS 2.x设计的,对支持这些技术的任何替代方法(旧版JAX-RPC使用除外)没有兴趣。 Axis2旨在支持开放式技术范围,尤其是在XML数据绑定领域。 尽管它包括对JAXB 2.x和JAX-WS 2.x的支持,但是并没有赋予它们任何特殊的状态。 (如果有的话,JAX-WS可能是Axis2中的第二类替代品,因为-如“ Axis2中的JAXB和JAX-WS ”中所讨论的-您无法为JAX-WS服务配置WS-Security或其他功能。 )
从结构上讲,两个堆栈都将处理程序用作请求和响应处理的一部分。 Axis2以此处理程序方法为基础来实现模块 :基本SOAP消息交换的可插入扩展,用于以高度可配置的方式实现WS- *技术。 Metro通过处理程序支持各种WS- *技术,但是这些技术已集成到Metro引擎中,而不是可分离的组件中。 Metro使用的集成方法没有Axis2模块灵活,但在配置和使用WS- *扩展时确实提供了一些优势。
这两个堆栈在客户端代码如何使用WSDL服务定义方面也有所不同。 Axis2主要使用WSDL服务定义进行客户端代码生成,从WSDL中提取服务配置信息,并在运行时生成代码以构建匹配的Axis2客户端配置(尽管您也可以在运行时解析WSDL服务定义)。 为了构建服务配置,JAX-WS 2.x以及Metro都需要在运行时定义WSDL服务。 这种运行时WSDL用法增加了一些启动开销(尽管仅用于第一次服务调用),而没有任何明显的好处。
服务器端也有差异。 对于HTTP传输的常见情况,通常将Axis2设置为单独的Web应用程序(WAR文件),并向该Axis2 Web应用程序部署任意数量的单独服务(尽管也可以将其打包为应用程序WAR的一部分) 。 您可以通过网页上传或通过将Axis2服务AAR文件直接拖放到扩展的Axis2 Web应用程序的相应目录中来部署服务。 单个服务配置信息通常是由Axis2在构建时从WSDL服务定义生成的,然后包含在服务AAR文件中。 标准的Axis2 Web应用程序还通过Web页面界面提供了各种监视和控制工具。
相反,Metro要求您为每个Web服务应用程序构建一个单独的WAR文件,而Metro库JAR文件要么包含在WAR中,要么包含在类路径中(作为HTTP服务器安装的一部分),并带有WEB-INF / WAR中存在web.xml文件,该文件同时引用您的服务和Metro servlet。 使用Metro独立服务器时,还需要创建sun-jaxws.xml配置文件,该文件提供有关服务配置的其他信息。 这些配置文件中的信息与实际Web服务类中的JAX-WS批注结合在一起,以完全为您的服务配置Metro。 因为它是为以这种嵌入式方式使用而设计的,所以Metro不提供任何直接的监视或控制工具。
Axis2和Metro都还提供集成的HTTP服务器支持。 在Metro情况下,这是通过JAX-WS功能javax.xml.ws.Endpoint
类实现的。 Axis2和Metro / JAX-WS集成的HTTP服务器都适合用于测试或用作异步响应端口,但是对于托管生产Web服务,支持Servlet API的Java应用程序服务器是首选方法。
样品申请
该代码下载提供了本系列以前的文章中使用的简单库管理服务的一个版本,对此版本进行了修改以演示Metro的用法。 与早期版本一样,WSDL服务定义定义了四个操作:
getBook
检索由国际标准书号(ISBN)标识的特定书的详细信息getBooksByType
检索特定类型的所有书籍的详细信息getTypes
查找可用书籍的类型addBook
将新书添加到库中
在“ Axis2中的JAXB和JAX-WS ”中,您看到了此应用程序在Axis2中的工作方式,首先使用JAXB 2.x数据绑定通过常规的Axis2代码生成,然后使用JAX-WS 2.x服务配置。 您在该文章中看到的大部分内容也适用于使用Metro时。 除了服务名称和端点地址以外,WSDL相同,所生成的JAXB数据模型相同,甚至所生成的服务类也相同,除了Java包和JAX-WS批注中使用的服务名称之外。
客户端使用
Metro上的示例应用程序的客户端代码与将AX2与AX2一起使用的客户端代码相同,甚至构建步骤也相同。 有关代码和处理的详细信息,请参见“ Axis2中的JAXB和JAX-WS ”。
服务器端使用
Metro上的示例应用程序的服务器端代码也与将AX2与AX2一起使用的服务器端代码相同,但是构建步骤有所不同。 使用Axis2,您可以通过创建包含服务和数据模型类的JAR文件来准备部署服务,然后通过将该JAR放到Axis2服务器安装中的WEB-INF / servicejars目录中来部署服务。
使用Metro时,您需要创建一个包含服务和数据模型类,Metro库JAR的WAR文件(尽管您可以将Metro JAR直接安装到Web服务器中-如果您使用的是Tomcat,则Metro下载包括一个metro-on-tomcat.xml用于安装JAR的Ant构建文件(带有文档中的说明),以及一对配置文件。 WEB-INF / web.xml文件配置实际的servlet处理。 清单1显示了用于示例应用程序的版本:
清单1.示例应用程序web.xml
<web-app version="2.4" xmlns="/xml/ns/j2ee"><display-name>MetroLibrary</display-name><description>Metro Library Service</description><listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class></listener><servlet><servlet-name>MetroLibraryPort</servlet-name><display-name>MetroLibraryService</display-name><description>Endpoint for Metro Library Service</description><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>MetroLibraryPort</servlet-name><url-pattern>/</url-pattern></servlet-mapping><session-config><session-timeout>60</session-timeout></session-config></web-app>
如果您以前使用过Java Web应用程序, 清单1 WEB-INF / web.xml文件应该看起来很熟悉(至少在结构上)。 所使用的特定条目会告知WAR文件已部署到的servlet引擎,以将com.sun.xml.ws.transport.http.servlet.WSServletContextListener
类用作servlet上下文事件的侦听器,并使用com.sun.xml.ws.transport.http.servlet.WSServlet
类作为实际的servlet。 这些类特定于Sun的Metro堆栈,并且需要这些类的引用才能使用Metro。 将该servlet配置为接收所有传入此Web应用程序的请求(通过<url-pattern>/</url-pattern>
条目)。
清单1的 WEB-INF / web.xml文件本身只是将servlet引擎配置为使用Metro提供的侦听器和servlet。 单独的文件WEB-INF / sun-jaxws.xml(如清单2所示)用于配置Metro,以将servlet接收到的请求路由到服务实现代码。
清单2.示例应用程序sun-jaxws.xml
<endpoints xmlns="/xml/ns/jax-ws/ri/runtime" version="2.0"><endpoint name="MetroLibraryPort"implementation="com.sosnoski.ws.library.metro.MetroLibraryImpl"url-pattern="/"wsdl-location="WEB-INF/wsdl/library.wsdl"/></endpoints>
清单2的 WEB-INF / sun-jaxws.xml文件非常简单,只有一个端点定义,它提供了端口名称,实现类,要与请求匹配的模式以及WSDL文档位置。 WSDL文档位置是此端点定义的唯一可选部分。 如果未在sun-jaxws.xml文件中为服务端点指定WSDL文档,Metro会在运行时自动生成一个。
捆绑问题
从Java SE 6开始,JAXB 2.x和JAX-WS 2.x参考实现运行时(供应商扩展除外)成为标准Java运行时环境(JRE)库的一部分。 这样做的目的是促进将这些技术用作Java标准,但是它有一个不幸的副作用:您可能需要对JRE安装进行更改,才能使用这些技术的较新版本。
样本应用程序下载中使用的build.xml将Metro JAR文件直接复制到服务WAR文件中。 当使用Java SE 5和Java SE 6 JDK / JRE安装将应用程序部署到Apache Tomcat 6.0.20 Web服务器时,这在作者的系统上起作用。 如果在使用Java SE 6或更高版本时,类加载冲突(例如ClassCastException
或未找到com.sun.xml...
类)导致问题,请通过以下方法解决:
确保您使用的系统具有最新版本的JRE,因为更新可能包括JAXB 2.x和JAX-WS 2.x的更高版本。 使用java.endorsed.dirs
系统属性从Metro lib目录中指定一个包含webservices-api.jar文件的目录( 仅包含webservices-api.jar文件,因为包括其他JAR会导致类加载冲突)作为以下文件的来源更新的库。 (Tomcat 6.0.x通过查找JAVA_ENDORSED_DIRS
环境变量并将其用作系统属性值来支持此机制。) 如果所有其他方法均失败,请在JRE安装的lib目录中创建一个认可目录(如果尚不存在),然后将Metro webservices-api.jar文件复制到该目录中。
使用后两种技术中的任何一种,您无需在服务WAR文件中包含Metro webservices-api.jar,因为它将直接在Web服务器的类路径中可用。
构建并运行示例代码
在尝试示例代码之前,您需要在系统上下载并安装最新版本的Metro(该代码已经在1.5版本中进行了测试)(请参阅参考资料 )。 您还需要在解压缩的示例代码下载的根目录中编辑build.properties文件,以将metro-home
属性的值更改为Metro安装路径。 如果要在其他系统或端口上的服务器上进行测试,则可能需要更改host-name
和host-port
。
要使用提供的Ant build.xml构建示例应用程序,请打开控制台到下载代码的根目录,然后键入ant
。 这将首先调用JAX-WSwsimport
工具(包含在Metro发行版中),然后编译客户端和服务器,最后将服务器代码打包为WAR。 然后,您可以将生成的metro-library.war文件部署到测试服务器,最后在控制台上键入ant run
来尝试运行示例客户端。 样本客户端通过对服务器的一系列请求序列,为每个请求打印简要结果。
接下来在地铁上
在本文中,您已经了解了使用Metro Web服务堆栈的基础知识。 由于Metro使用JAX-WS 2.x批注进行配置,因此“ Axis2中的JAXB和JAX-WS ”中使用的相同JAX-WS 2.x示例应用程序代码也适用于Metro。 唯一需要进行的更改涉及如何在服务器端打包和部署代码,而Metro和Axis2则有很大不同。 Metro使用嵌入方法,您可以通过该方法为每个服务或一组服务创建一个Web应用程序(并且不提供控制或监视功能)。 Axis2通常将单个专用的Web应用程序用作任何数量的单个服务的主机(具有直接通过Web页面界面提供的基本控制和监视功能)。
除了Web服务消息交换的基础知识之外,Metro还支持SOAP扩展,例如WS-Security。 就像服务打包问题一样,Metro和Axis2在该领域采用不同的方法来满足非常相似的要求。 在下一篇文章中,您将看到Metro如何处理与本系列先前使用Axis2相同的WS-Security示例。
翻译自: /developerworks/java/library/j-jws9/index.html