40.3. 生成 Stub Code


概述

调用异步方式需要额外存根代码,以用于 SEI 中定义的专用异步方法。默认不生成此特殊存根代码。要在异步功能上切换并生成必要的存根代码,您必须使用 WSDL 2.0 规范中的映射自定义功能。

通过自定义,您可以修改 Maven 代码生成插件生成 stub 代码的方式。特别是,您可以修改 WSDL-to-Java 映射并切换某些功能。在这里,自定义用于切换异步调用功能。使用绑定声明指定自定义,您可以使用 jaxws:bindings 标签(其中 jaxws 前缀绑定到 http://java.sun.com/xml/ns/jaxws 命名空间)进行定义。有两种指定绑定声明的方法:

外部绑定声明
当使用外部绑定声明时,在与 WSDL 合同独立的文件中定义 jaxws:bindings 元素。在生成 stub 代码时,您可以将绑定声明文件的位置指定为代码生成器。
嵌入式绑定声明
使用嵌入式绑定声明时,您可以直接嵌入 WSDL 合同中的 jaxws:bindings 元素,将它视为 WSDL 扩展。在本例中,jaxws:bindings 中的设置仅应用到即时父元素。

使用外部绑定声明

例 40.2 “一个同步绑定拒绝的模板” 中显示了在异步调用时切换的绑定声明文件的模板。

例 40.2. 一个同步绑定拒绝的模板

<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
          wsdlLocation="AffectedWSDL"
          xmlns="http://java.sun.com/xml/ns/jaxws">
  <bindings node="AffectedNode">
    <enableAsyncMapping>true</enableAsyncMapping>
  </bindings>
</bindings>

其中 AffectedWSDL 指定受这个绑定声明影响的 WSDL 合同的 URL。AffectedNode 是一个 XPath 值,用于指定 WSDL 合同中哪些节点(或节点)会受到这个绑定声明的影响。如果您希望整个 WSDL 协议会受到影响,请将 AffectedNode 设置为 wsdl:definitions。将 jaxws:enableAsyncMapping 元素设置为 true 以启用异步调用功能。

例如,如果只想为 GreeterAsync 接口生成异步方法,您可以指定 <bindings node="wsdl:definitions/wsdl:portType[@name='GreeterAsync']">。

假设绑定声明存储在一个文件中,async_binding.xml 中,您将设置 POM,如 例 40.3 “消费者代码生成” 所示。

例 40.3. 消费者代码生成

<plugin>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-codegen-plugin</artifactId>
  <version>${cxf.version}</version>
  <executions>
    <execution>
      <id>generate-sources</id>
      <phase>generate-sources</phase>
      <configuration>
        <sourceRoot>outputDir</sourceRoot>
        <wsdlOptions>
          <wsdlOption>
            <wsdl>hello_world.wsdl</wsdl>
            <extraargs>
              <extraarg>-client</extraarg>
              <extraarg>-b async_binding.xml</extraarg>
            </extraargs>
          </wsdlOption>
        </wsdlOptions>
      </configuration>
      <goals>
        <goal>wsdl2java</goal>
      </goals>
    </execution>
  </executions>
</plugin>

b 选项告诉代码生成器查找外部绑定文件。

有关代码生成器的更多信息,请参阅 第 44.2 节 “cxf-codegen-plugin”

使用嵌入的绑定声明

您还可以通过将 jaxws:bindings 元素及其关联 jaxws:enableAsynchMapping 子对象直接嵌入到 WSDL 定义服务的 WSDL 文档中。您还必须为 jaxws 前缀添加命名空间声明。

例 40.4 “带有嵌入式 Binding Declaration (同步映射)的 WSDL” 显示 WSDL 文件,其中包含用于激活操作的异步映射的嵌入式绑定声明。

例 40.4. 带有嵌入式 Binding Declaration (同步映射)的 WSDL

<wsdl:definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
                  ...
                  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
                  ...>
  ...
  <wsdl:portType name="GreeterAsync">
    <wsdl:operation name="greetMeSometime">
      <jaxws:bindings> <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping> </jaxws:bindings>
      <wsdl:input name="greetMeSometimeRequest"
                  message="tns:greetMeSometimeRequest"/>
      <wsdl:output name="greetMeSometimeResponse"
                   message="tns:greetMeSometimeResponse"/>
    </wsdl:operation>
  </wsdl:portType>
  ...
</wsdl:definitions>

将绑定声明嵌入到 WSDL 文档中时,您可以通过更改您放置声明的位置来控制受声明影响的范围。当声明被放入 wsdl:definitions 元素的子部分时,代码生成器会为 WSDL 文档中定义的所有操作创建异步方法。如果它被置于 wsdl:portType 元素的子项,则代码生成器会为接口中定义的所有操作创建异步方法。如果它被置于 wsdl:operation 元素的子项,则代码生成器只为该操作创建异步方法。

在使用嵌入式声明时,不需要将任何特殊选项传递给代码生成器。代码生成器将识别它们并相应地操作。

生成的接口

以这种方式生成存根代码后,GreeterAsync SEI (在文件 GreeterAsync.java中)被定义,如 例 40.5 “带有同步调用的方法的服务端点接口” 所示。

例 40.5. 带有同步调用的方法的服务端点接口

package org.apache.hello_world_async_soap_http;

import org.apache.hello_world_async_soap_http.types.GreetMeSometimeResponse;
...

public interface GreeterAsync
{
  public Future<?> greetMeSometimeAsync(
        java.lang.String requestType,
        AsyncHandler<GreetMeSometimeResponse> asyncHandler
    );

    public Response<GreetMeSometimeResponse> greetMeSometimeAsync(
        java.lang.String requestType
    );

    public java.lang.String greetMeSometime(
        java.lang.String requestType
    );
}

除了通常的同步方法 greetMeSometime () 外,还会为 greetMeSometime 操作生成两种异步方法:

  • 回调方法使用公共Future<?&gt;greetMeSomtimeAsyncjava.lang.StringrequestTypeAsyncHandler<GreetMeSomtimeResponse>asyncHandler
  • 轮询方法公共Response<GreetMeSomeTimeResponse&gt;greetMeSometimeAsyncjava.lang.StringrequestType
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.