Welcome 微信登录

首页 / 软件开发 / JAVA / Java Web服务 - Axis2中的JAXB和JAX-WS

Java Web服务 - Axis2中的JAXB和JAX-WS2011-01-30 IBM Dennis Sosnoski早期的 Apache Axis 建立在第一个面向 Web 服务的 Java 标准 JAX-RPC 的基础之上。事实证明,这并不是一个很好的方法,因为 JAX-RPC 限制了 Axis 代码的内部设计,而且造成了性能问题并缺乏灵活性。JAX-RPC 还对 Web 服务开发的方向作出了假设,而这在后来被证明是错误的。

在开始 Axis2 开发工作时,已经着手研究 JAX-RPC 的替代选择,因此,Axis2 在设计时已经考虑到了足够的灵活性,使其能够在基础框架之上实现对替代 Web 服务标准的支持。最新的 Axis2 版本同时实现了对 JAXB 2.x Java XML 数据绑定标准和替代了 JAX-RP 的 JAX-WS 2.x Java Web 服务标准的支持。本文将展示如何将 JAXB 和 JAX-WS 用于 Axis2 并找出 Axis2 对这些标准的当前支持中存在的一些限制。

Axis2 中的 JAXB

Axis2 实现了对 JAXB 2.x 的支持,将它作为数据绑定替代选择的其中之一,您可以在使用 WSDL2Java 从 Web Services Description Language (WSDL) 服务定义中生成代码时进行选择。和大多数其他替代选择一样,使用 JAXB 2.x 从 WSDL 中生成的代码创建了一组链接(linkage)类和一组数据模型类。这些链接类,包括一个客户端 stub 和一个服务器端消息接收器,充当应用程序代码和 Axis2 之间的接口。数据模型类表示实际的消息数据。

JAXB 2.x 使用数据模型类中的注释来控制数据与 XML 之间的转换方式。注释方法允许您在无需修改源代码或重新编译类的情况下在运行时使用不同的 JAXB 实现。由 JAXB 实现负责从数据模型类访问注释信息并在执行 XML 转换时应用这些注释。

代码下载(参见 下载)提供了一个演示在 Axis2 中使用 JAXB 的示例应用程序,位于 jaxb 目录中。这个应用程序是本系列前一篇文章中的简单的库管理服务的另一个版本(包括 “Axis2 Data Binding” 中的数据绑定比较)。WSDL 服务定义定义了四个操作:

getBook 用来检索由 International Standard Book Number (ISBN) 标识的某本特定图书的细节信息

getBooksByType 用来检索某一特定类型的所有图书的细节信息

getTypes 用于查找可用的图书类型

addBook 用于将新书添加到库中

清单 1 显示的是经过大量编辑的 WSDL,只包含了与 getBook 操作有关的部分:

清单 1. 库服务 WSDL

<wsdl:definitions targetNamespace="http://ws.sosnoski.com/library/wsdl"
xmlns:wns="http://ws.sosnoski.com/library/wsdl"
xmlns:tns="http://ws.sosnoski.com/library/types"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>

<schema elementFormDefault="qualified"
targetNamespace="http://ws.sosnoski.com/library/wsdl"
xmlns="http://www.w3.org/2001/XMLSchema">

<import namespace="http://ws.sosnoski.com/library/types"
schemaLocation="types.xsd"/>

<element name="getBook">
<complexType>
<sequence>
<element name="isbn" type="string"/>
</sequence>
</complexType>
</element>

<element name="getBookResponse">
<complexType>
<sequence>
<element name="getBookReturn" minOccurs="0" type="tns:BookInformation"/>
</sequence>
</complexType>
</element>
...

</schema>

</wsdl:types>

<wsdl:message name="getBookRequest">
<wsdl:part element="wns:getBook" name="parameters"/>
</wsdl:message>

<wsdl:message name="getBookResponse">
<wsdl:part element="wns:getBookResponse" name="parameters"/>
</wsdl:message>
...

<wsdl:portType name="Library">

<wsdl:operation name="getBook">
<wsdl:input message="wns:getBookRequest" name="getBookRequest"/>
<wsdl:output message="wns:getBookResponse" name="getBookResponse"/>
</wsdl:operation>
...

</wsdl:portType>

<wsdl:binding name="LibrarySoapBinding" type="wns:Library">

<wsdlsoap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="getBook">

<wsdlsoap:operation soapAction="urn:getBook"/>

<wsdl:input name="getBookRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>

<wsdl:output name="getBookResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>

</wsdl:operation>
...

</wsdl:binding>

<wsdl:service name="jaxb-library">

<wsdl:port binding="wns:LibrarySoapBinding" name="library">
<wsdlsoap:address location="http://localhost:8080/axis2/services/jaxb-library"/>
</wsdl:port>

</wsdl:service>

</wsdl:definitions>