在 Weblogic Server 10 中使用 JAX-WS 和 JAXB:JAX-WS 自定义绑定
页面: 1, 2, 3

使用JAX-WS绑定声明指定SEI提供者接口类名

class 绑定声明用于为SEI(Service Endpoint Implementation,服务端点实现)指定 提供者接口类。以下内容摘录自 etc/server-jaxws.xbd 文件,它展示了如何使用 class 绑定声明实现此目的。

<bindings

   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

   xmlns="http://java.sun.com/xml/ns/jaxws"

    
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
node="wsdl:definitions/wsdl:portType[@name = 'DataStaging']"
> <jxb:javadoc> <![CDATA[<body>Name of Provider interface class for JAX-WS
DataStagingService
</body>.]]> </jxb:javadoc>
<class name="DataStagingService2"/>
</bindings> ... </bindings>

此处,我向 wsimport Ant任务指定生成的SEI接口类的名称为 DataStagingService2wsdlLocation 属性指定了要处理的WSDL文件的位置。此位置与绑定声明文件的位置有关,因此前面没有任何路径。XPath表达式选择WSDL中的 portType 元素,生成的接口类的名称就是由此而来(默认情况)。

您将在 WebContent/WEB-INF/lib/DataStagingService2_wsdl.jar 文件中发现最终的 services.datastaging.DataStaging2.java 文件。

使用JAX-WS绑定声明指定框架SEI类名

还可以使用 class 绑定声明控制框架Java源文件(由 wsimport Ant任务生成)的名称(执行 wsdlc Ant任务时发生)。所使用类绑定声明与用于其他目的的 class 绑定声明是一样的,因此不必感到迷惑。

我通过 class 绑定声明指定 etc/server-jaxws.xbd 文件中的框架Java源文件的名称。以下是绑定声明文件的摘录:

<bindings

   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

   xmlns="http://java.sun.com/xml/ns/jaxws"

    
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
node="wsdl:definitions/wsdl:service[@name = 'DataStagingService']"
> <jxb:javadoc> <![CDATA[<body>Name of skeleton SEI class for JAX-WS
DataStagingService
</body>.]]> </jxb:javadoc>
<class name="DataStagingPortTypeImpl"/>
</bindings> ... </bindings>

黑体字表示重点内容。它们告诉 wsimport Ant任务您希望框架类的名称为 DataStagingPortTypeImpl。如果没有定义此绑定声明,则所生成框架类的名称将以WSDL中的 <service> 元素的 name 属性的值为准。

遗憾的是,通过以上操作并不能生成预期的输出。原因如下:

  1. 所生成的 DataStagingPortTypeImpl 类的Java包名最终为 com.acmeworld.irad.services.datastaging,而不是 services.datastaging。我尝试使用 <package>services.datastaging</package> 绑定声明,又通过 node="wsdl:definitions" 属性绑定 <jaxws:bindings> 元素。两种方法均不奏效。

  2. 扩展了 javax.xml.ws.Service 的JAX-WS类的名称也是 DataStagingPortTypeImpl。该类由服务使用者使用,因此我“没有管它”(因为我在提供者端)。

  3. 如果指定一个 method 绑定声明修改Web服务操作的名称,这些修改并不会传递给第1条中所生成的 DataStagingPortTypeImpl 类。似乎通过 parameter 绑定声明进行的修改也不具有传递性。

我认为所有这些异常都是由 wsdlcwsimport Ant任务所使用的一个类中的bug造成的。这些异常并不会带来什么副作用,因此我选择使用Ant <replace> 任务操作生成的框架SEI Java源来解决此问题。

注意:BEA技术支持部门已经记录上述问题,此bug将在WebLogic Server 10补丁或未来的服务包中得到“永久解决”。

使用JAX-WS绑定声明指定方法名

我们可以通过 method 绑定声明控制生成代码中的方法名称。生成的Java源代码中的代理类(扩展了 javax.xml.ws.Service)的getter方法便是可以修改的方法之一。以下是 etc/client-jaxws.xbd 文件中与之相关的内容。该内容同样出现于 etc/server-jaxws.xbd 文件中:

<bindings

   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

   xmlns="http://java.sun.com/xml/ns/jaxws"

    
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
node="wsdl:definitions/wsdl:service[@name = 'DataStagingService']/wsdl:port[@name = 'DataStagingServicePort']"
> <jxb:javadoc> <![CDATA[<body>Returns proxy object used as the
Dynamic Proxy client API
when invoking Web service operations on the
DataStagingService
</body> Web service.]]> </jxb:javadoc>
<method name="getDataStagingPort"/>
</bindings> ... </bindings>

上述代码将getter方法名称从 getDataStagingServicePort(默认名称)修改为 getDataStagingPort。您将在 test.consumers.datastaging.standalone.jaxws.DataStagingService.java 文件中找到结果,该文件位于 lib/UC-01Client.jar 文件中。

还可以修改Web服务操作所使用的方法名:

 

<bindings

    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

    xmlns="http://java.sun.com/xml/ns/jaxws"

     
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
node="wsdl:definitions/wsdl:portType[@name='DataStaging']/wsdl:operation[@name='dataStaging']"
> <jxb:javadoc> <![CDATA[<body>Sends URIs of resources to be staged</body>]]> </jxb:javadoc>
<method name="sendInputURIs"/>
</bindings> ... </bindings>

在上述代码中,我使用 method 绑定声明将 dataStaging Web服务操作的名称修改为 sendInputURIs。您将在 test.consumers.datastaging.standalone.jaxws.DataStaging.java 文件中找到结果,该文件位于 lib/UC-01Client.jar 文件中。

使用JAX-WS绑定声明指定方法参数名

我们可以通过 parameter 绑定声明控制框架SEI类的访问所使用的参数名称。它使用:

  • 含有XPath表达式的 part 属性查找要修改的参数名称。

  • element 属性在 WSDL 中选择 <part> 元素。

  • name 属性指定参数的新名称。

以下是 etc/server-jaxws.xbd 文件中的相关内容:

 

<bindings

   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

   xmlns="http://java.sun.com/xml/ns/jaxws"

    
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://services.irad.acmeworld.com/datastaging"
node="wsdl:definitions/wsdl:portType[@name='DataStaging']/wsdl:operation[@name='dataStaging']"
> <jxb:javadoc> <![CDATA[<body>Input parameter for the
dataStaging
</body> method.]]> </jxb:javadoc>
<parameter

part="wsdl:definitions/wsdl:message[@name='dataStaging']/wsdl:part[@name='parameters']"

element="tns:dataStaging"

name="inputURIs"

/>
</bindings> ... </bindings>

之前,我使用 class 绑定声明将方法名从 dataStaging 修改为 sendInputURIs。此处,我尝试使用 parameter 绑定声明将参数名从 parameters 修改为 inputURIs。可是并没有生效,其原因似乎与下面这个重大发现有关:

如果文件中还有一个 <enableWrapperStyle>true</enableWrapperStyle> 绑定声明,则 parameter 绑定声明不会起作用。

原来 <enableWrapperStyle>true< enableWrapperStyle> 绑定声明会“自动”导致参数名称被修改为 inputURIs。我决定在服务使用者端使用 <enableWrapperStyle>false</enableWrapperStyle> 取代它。这样,我至少还可以演示 parameters 绑定声明的使用。

使用JAX-WS绑定声明指定异常类名

我们还可以通过 class 绑定声明控制框架SEI类中的方法所使用的异常类的名称。 以下是 etc/server-jaxws.xbd 文件中与之相关的内容:

 

<bindings

   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

   xmlns="http://java.sun.com/xml/ns/jaxws"

    
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
node="wsdl:definitions/wsdl:portType[@name='DataStaging']/wsdl:operation[@name='dataStaging']/wsdl:fault[@name='JAXWSArticleException']"
> <jxb:javadoc> <![CDATA[<body>General purpose exception for JAX-WS
DataStagingService
</body>.]]> </jxb:javadoc>
<class name="DataStagingServiceException"/>
</bindings> ... </bindings>

这样将导致生成一个 DataStagingServiceException 类。它将存放在 WebContent/WEB-INF/lib/DataStagingService2_wsdl.jar 文件的 services.datastaging 目录中。

使用JAX-WS绑定声明指定异步

JAX-WS规范定义了两个范例,用于编写异步客户机:

  • 探询(Polling)   此范例将使用探询判断响应是否可用。来自 operationAsync 方法调用的返回类型为 javax.xml.ws.Response 对象的实例。此 javax.xml.ws.Response 对象中的方法具有以下功能:

    1. 取消调用。
    2. 无限期阻塞,等待服务器响应。
    3. 阻塞一段时间,等待服务器响应。
    4. 确定调用是否取消。
    5. 确定调用是否完成,以便随后获得响应。
  • 回调(Callback)   在此范例中,客户机将提供一个回调处理程序用于接收和处理传入响应对象。此回调处理程序需求实现 javax.xml.ws.AsyncHandler 接口,其中含有一个 void handleResponse(Response) 回调方法。 javax.xml.ws.AsyncHandler 扩展了 javax.xml.ws.Response,但是您只需要使用 get() 方法。

当请求在服务提供者端进行处理时,两个范例都允许JAX-WS客户机继续执行工作。以下内容摘录自 etc/client-jaxws.xbd 文件,它展示了如何指定 <enableAsyncMapping> 绑定声明:

 

<bindings

   xmlns:jxb="http://java.sun.com/xml/ns/jaxb"

   xmlns="http://java.sun.com/xml/ns/jaxws"

    
                        
wsdlLocation="DataStagingService2.wsdl"
> ... <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
node="wsdl:definitions/wsdl:portType[@name='DataStaging']/wsdl:operation[@name='dataStaging']"
>
<enableAsyncMapping>true</enableAsyncMapping>
</bindings> ... </bindings>

这样只会生成一个异步版本的 dataStaging 方法。如果希望所有方法都有异步版本,需要将 <enableAsyncMapping>true</enableAsyncMapping> 移到到最初的位置。异步方法将位于 test.consumers.datastaging.standalone.jaxws.DataStaging.java 文件中,该文件作为 JAR 文件打包在 lib/UC-01Client.jar 文件中。

页面: 1, 2, 3

下一页 »