RSS订阅
RSS订阅TT SOA
您现在的位置:TT SOA > Java Web服务 > JAX-WS 2.0规范(五)

JAX-WS 2.0规范(五)

2008-10-10  选择字号:  | |
打印本文章

导读:XML Schema类型到Java的映射由JAXB 2.0规范描述。wsdl:types部分的内容随同一些其他的type或元素声明被传递到JAXB。JAXB支持将XML types映射到Java接口或类。

关键词:XML Schema Java JAXB 2.0

正在加载数据...

  此部分继续描述WSDL 1.1到Java映射的其他部分。  

  2.3.2 参数次序和返回类型

  Wsdl:operation元素可以有一个parameterOrder属性,它定义了映射的Java方法中的参数顺序,如下:

  1 <!-- WSDL extract -->

  2 <types>

  3 <xsd:element name="setLastTradePrice">

  4 <xsd:complexType>

  5 <xsd:sequence>

  6 <xsd:element name="tickerSymbol" type="xsd:string"/>

  7 <xsd:element name="lastTradePrice" type="xsd:float"/>

  8 </xsd:sequence>

  9 </xsd:complexType>

  10 </xsd:element>

  11

  12 <xsd:element name="setLastTradePriceResponse">

  13 <xsd:complexType>

  14 <xsd:sequence/>

  15 </xsd:complexType>

  16 </xsd:element>
 
  17 </types>

  18

  19 <message name="setLastTradePrice">

  20 <part name="setLastTradePrice"

  21 element="tns:setLastTradePrice"/>

  22 </message>

  23

  24

  25 <message name="setLastTradePriceResponse">

  26 <part name="setLastTradePriceResponse"

  27 element="tns:setLastTradePriceResponse"/>

  28 </message>

  29

  30

  31 <portType name="StockQuoteUpdater">

  32 <operation name="setLastTradePrice">

  33 <input message="tns:setLastTradePrice"/>

  34 <output message="tns:setLastTradePriceResponse"/>

  35 </operation>

  36 </portType>

  37

  38 // non-wrapper style mapping

  39 SetLastTradePriceResponse setLastTradePrice(

  40 SetLastTradePrice setLastTradePrice);

  41

  42 // wrapper style mapping

  43 void setLastTradePrice(String tickerSymbol, float lastTradePrice);

  2.3.3 Holder类

  Holder类用来在映射的方法签名里支持out和in/out参数。他们为不可变的对象引用提供一个可变的包装。JAX-WS定义了一个一般的holder类(javax.xml.ws.Holder<T>),可以被任何Java类使用。

  如果参数的XML数据类型可以自然地被映射成为一个Java原始类型(比如,xsd:int到int),那么它可以不被映射到一个Holder。比如一个out或in/out参数,它的XML数据类型可以很自然地映射到Java的int类型,而不用映射到Holder(java.lang.Integer)。

  2.3.4 异步

  除了wsdl:operation的不同映射之外,客户端的异步的映射也是支持的。异步映射被期待在一些情况而不是所有情况下有用。因此对于用户来说,客户端的异步方法的产生是可选的。

  异步映射要求实现必须支持异步映射。

  2.3.4.1 标准的异步映射接口

  异步操作映射用到下面的标准接口:

  javax.xml.ws.Response         一个普通的接口,用来将带有响应上下文的方法调用结果分组。Response继承了Future<T>来提供异步结果投票表决能力。

  javax.xml.ws.AsyncHandler  一个普通的接口,客户端实现这个接口来接收异步回调结构。

  2.3.4.2 Operation(操作)

  每一个wsdl:operation在相应的SEI(service endpoint interface)被映射到两个附加的方法:

  Polling方法  polling方法返回一个Response<ResponseBean>,它可以使用继承自Future<T>的方法来决定什么时候操作完成以及得到结果。

  Callback方法  回调方法有一个额外的final参数,它是AsyncHandler<ResponseBean>的一个实例,返回一个Future<?>,这个通配符可以投票决定操作什么时候完成。Future<?>.get()返回的对象没有标准的类型。客户端代码不该试图将这个对象映射为任何一个特殊的类型,因为这将导致不方便的行为。

  应用可以使用jaxws:method来定制这个映射。

  2.3.4.3 message和part

  异步映射支持包装和非包装映射类型,但是它如何映射out和in/out部分是不同的。

  in    part或wrapper child被映射到方法在2.3.1中描述。

  out   part或wrapper child被映射到响应bean的属性里

  In/out part或wrapper child被映射到方法参数以及响应应bean的属性里

  2.3.4.4 Response Bean

  response bean是一个操作输出信息的映射,它包含每一个out以及in/out消息part或wrapper child的属性。

  2.3.4.5 Faults(错误)

  WSDL错误到服务特有异常的映射对于异步和同步是相同的。2.5部分描述了这个映射。然而,映射的异步方法不能直接抛出服务特定的异常。相反,当一个客户端试图通过Response.get获取异步方法调用的时候,java.util.concurrent.ExecutionException被抛出。

  Response是一个静态的接口,它的get方法不能抛出服务特定异常。Response实例会抛出ExecutionException而不抛出一个服务特定的异常。

  2.3.4.6 映射举例及使用

  下面将展示一个异步操作映射的例子。

  1 <!-- WSDL extract -->

  2 <message name="getPrice">

  3 <part name="ticker" type="xsd:string"/>

  4 </message>

  5

  6

  7 <message name="getPriceResponse">

  8 <part name="price" type="xsd:float"/>

  9 </message>

  10

  11

  12 <portType name="StockQuote">
 
  13 <operation name="getPrice">

  14 <input message="tns:getPrice"/>

  15 <output message="tns:getPriceResponse"/>

  16 </operation>

  17 </portType>

  18

  19 <!-- Synthesized response bean element -->

  20 <xsd:element name="getPriceResponse">

  21 <xsd:complexType>

  22 <xsd:sequence>

  23 <xsd:element name="price" type="xsd:float"/>

  24 </xsd:sequence>

  25 </xsd:complexType>

  26 </xsd:element>

  27

  28 // synchronous mapping

  29 @WebService

  30 public interface StockQuote {

  31 float getPrice(String ticker);

  32 }

  同步的使用:

  1 Service service = ...;

  2 StockQuote quoteService = (StockQuote)service.getPort(portName);

  3 Float quote = quoteService.getPrice(ticker);

  异步使用:

  Asynchronous polling use.

  1 Service service = ...;

  2 StockQuote quoteService = (StockQuote)service.getPort(portName);

  3 Response<Float> response = quoteService.getPriceAsync(ticker);

  4 while (!response.isDone()) {

  5 // do something while we wait

  6 }

  7 Float quote = response.get();

  Asynchronous callback use.

  1 class MyPriceHandler implements AsyncHandler<Float> {

  2 ...

  3 public void handleResponse(Response<Float> response) {

  4 Float price = response.get();

  9 Service service = ...;

  10 StockQuote quoteService = (StockQuote)service.getPort(portName) ;

  11 MyPriceHandler myPriceHandler = new MyPriceHandler();

  12 quoteService.getPriceAsync(ticker, myPriceHandler);

  2.4 Types

  <wsdl:types>

  <xs:schema attributeFormDefault="unqualified"   elementFormDefault="unqualified"    targetNamespace="http://service.cxf.cvicse.com/"   xmlns:tns="http://service.cxf.cvicse.com/"   xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="findUsers" type="tns:findUsers" />

    <xs:element name="findUsersResponse" type="tns:findUsersResponse" />

    <xs:element name="say" type="tns:say" />

    <xs:element name="sayResponse" type="tns:sayResponse" />

    <xs:element name="sayUserName" type="tns:sayUserName" />

    <xs:element name="sayUserNameResponse" type="tns:sayUserNameResponse" />

  <xs:complexType name="findUsers">

    <xs:sequence />

    </xs:complexType>

  <xs:complexType name="findUsersResponse">

  - <xs:sequence>

    <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="xs:anyType" />

    </xs:sequence>

    </xs:complexType>

  <xs:complexType name="say">

  - <xs:sequence>

    <xs:element minOccurs="0" name="arg0" type="xs:string" />

    </xs:sequence>

    </xs:complexType>

  <xs:complexType name="sayResponse">

  - <xs:sequence>

    <xs:element minOccurs="0" name="return" type="xs:string" />

    </xs:sequence>

    </xs:complexType>

  <xs:complexType name="sayUserName">
 
  - <xs:sequence>

    <xs:element minOccurs="0" name="user" type="tns:User" />

    <xs:element minOccurs="0" name="id" type="xs:string" />

    </xs:sequence>

    </xs:complexType>

  <xs:complexType name="User">

  - <xs:sequence>

    <xs:element minOccurs="0" name="id" type="xs:int" />

    <xs:element minOccurs="0" name="name" type="xs:string" />

    </xs:sequence>

    </xs:complexType>

  <xs:complexType name="sayUserNameResponse">

  - <xs:sequence>

    <xs:element minOccurs="0" name="return" type="xs:string" />

    </xs:sequence>

    </xs:complexType>
 
    </xs:schema>

    </wsdl:types>

  XML Schema类型到Java的映射由JAXB 2.0规范描述。wsdl:types部分的内容随同一些其他的type或元素声明被传递到JAXB。

  JAXB支持将XML types映射到Java接口或类。默认地,JAX-WS使用JAXB的基于类的映射,当然也支持基于接口的映射。

  2.5 Fault

  一个wsdl:fault元素被映射到一个Java异常。

  2.6 Binding

  从WSDL 1.1到Java的映射是基于wsdl:portType的抽象描述以及相关的操作。然而,protType到协议的绑定可以引入映射里的变化。

  1 <!-- WSDL extract -->

  2 <types>

  3 <xsd:schema targetNamespace="...">

  4 <xsd:element name="faultDetail">

  5 <xsd:complexType>

  6 <xsd:sequence>

  7 <xsd:element name="majorCode" type="xsd:int"/>

  8 <xsd:element name="minorCode" type="xsd:int"/>

  9 </xsd:sequence>

  10 </xsd:complexType>

  11 </xsd:element>

  12 </xsd:schema>

  13 </types>

  14

  15 <message name="operationException">

  16 <part name="faultDetail" element="tns:faultDetail"/>

  17 </message>

  18

  19

  20 <portType name="StockQuoteUpdater">

  21 <operation name="setLastTradePrice">

  22 <input .../>

  23 <output .../>

  24 <fault name="operationException"

  25 message="tns:operationException"/>

  26 </operation>

  27 </portType>

  28

  29 // fault mapping

  30 @WebFault(name="faultDetail", targetNamespace="...")

  31 class OperationException extends Exception {

  32 OperationException(String message, FaultDetail faultInfo) {...}

  33 OperationException(String message, FaultDetail faultInfo,

  34 Throwable cause) {...}

  35 FaultDetail getFaultInfo() {...}

  36 }

原文出处:http://gocom.primeton.com/blog13131_35328.htm
来源:goCom构客网    作者:liang_ma    
目前,SOA(面向服务架构)大潮正在席卷着整个世界,而且势不可挡。作为一种集成企业应用的方法论,SOA具备灵活性、标准性、重用性强和成本低等优点……
目前,SOA在国内外已经成为替代一度风靡的面向对象、BS结构、三层结构等软件解决方案的另一个热门词汇。几乎每一个IT公司都有基于SOA的解决方案……
Web的开始阶段是简单的网站(信息中介和信息发布的平台),随着Internet 和Intranent、Extranet的快速发展而发展成为各种应用的主要平台……
当XQuery查询时,不能满足XML的需求?我应该怎样使用XQuery查询?举一些具体的例子,说明你需要做的与XML可能会更容易提供一个确切的答案,但这里是一个概括……
从早期将XML转换为关系型数据表或大型对象,到今日转向原生XML数据型态,关系型数据库与XML之间的合作日益紧密……
虚拟化和SOA之间是一种间接的、相辅相成的关系。也许在IT及业务转型中,两者的结合使用会发挥最大的优势。虚拟化有助于更快地显示部署基础设施的投资回报率(ROI)。
云计算的概念越来越流行,Amazon、Google和IBM是第一批将云计算引入公众视线的公司。云计算就是新的Web2.0,一种既有技术上的市场绽放。
安全对于许多的IT部门来说都是一个重要的问题之一,但是SOA安全问题完全是在另一个新的纬度上了。对于SOA为一个机构所带来的许多的好处,例如具有在许多不同的提供者和供应商的情况下混合和匹配服务。
最新更新
专家答疑
技巧
Ron Schmelzer,Jason Bloomberg
你认为通过遵循IT组织步骤可以演变为SOA吗?ZapThink公司明确SOA实行肯定是一个挑战——也不应被视为这一倡议应得到执行的一个步骤就是整个企业的基础……
Dana Gardner
您能解释什么是“私有云”吗,能否举例说明?这是供应商需要建立的基础吗?作为托管服务供应商和服务供应商寻求最有效和最强大的基础设施,作为他们的“云”支持能力……
Andrew Pollack
我们正在寻找一种从主机选择SOAP服务器的请求。我们希望制造一个远程程序呼叫(RPC)从CICS程序的SOAP服务器,其中进程请求,使错误或成功后的反应……