41.2.3. 实施供应商对象


概述

提供者界面相对容易实施。它只具有一种方法,调用() 必须被实施。另外,它有三个简单的要求:

  • 实施必须含有 @WebServiceProvider 注释。
  • 实施必须具有默认的公共构造器。
  • 实施必须实施键入的提供者接口版本。

    换句话说,您无法实施 Provider<T> 接口。您必须实现使用 concrete 数据类型的接口版本,如 第 41.2.2 节 “数据类型” 中列出的。例如,您可以实施 Provider<SAXSource> 的实例。

实施 Provider 接口的复杂性是在处理请求消息并构建正确的响应的逻辑中。

使用消息

与基于较高级别的 SEI 服务实施不同,提供商实施将请求作为原始 XML 数据接收,并且必须作为原始 XML 数据发送响应。这要求开发人员对正在实施的服务所使用的消息有一定了解。这些详细信息通常可在描述服务的 WSDL 文档中找到。

WS-I 基本 配置集提供有关服务使用的信息的指南,包括:

  • 请求的 root 元素基于 wsdl:operation 元素的 name 属性的值,与调用的操作对应。

    警告

    如果服务使用 doc/literal bare 消息,则请求的 root 元素基于 wsdl:part 元素的 name 属性的值。

  • 所有消息的根元素都是命名空间限定。
  • 如果服务使用 rpc/literal 消息,则消息中的顶层元素不会被命名空间限定。

    重要

    顶级元素的子项可能是命名空间合格的,但在某些情况下您必须检查其架构定义。

  • 如果服务使用 rpc/literal 消息,则顶级元素都为空。
  • 如果服务使用 doc/literal 消息,则消息的 schema 定义决定任何元素是否满足命名空间。

@WebServiceProvider 注释

要将 JAX-WS 识别为服务实施,提供程序实施必须被 @WebServiceProvider 注释进行解码。

表 41.2 “@WebServiceProvider Properties” 描述可以为 @WebServiceProvider 注释设置的属性。

表 41.2. @WebServiceProvider Properties
属性描述

portName

指定定义服务端点的 wsdl:port 元素的 name 属性的值。

serviceName

指定包含服务端点的 wsdl:service 元素的 name 属性的值。

targetNamespace

指定服务 WSDL 定义的 targetname 空间。

wsdlLocation

指定定义该服务的 WSDL 文档的 URI。

所有这些属性都是可选的,默认情况下为空。如果您为空,Apache CXF 将使用实施类中的信息创建值。

实施 call ()方法

Provider 接口只有一个方法 calls (),必须实施它。调用() 方法接收打包为实施的 Provider 接口类型的对象类型的传入请求,并将响应消息返回成同一类型的对象。例如,实施 Provider<SOAPMessage> 接口接收请求作为 SOAPMessage 对象,并将响应作为 SOAPMessage 对象返回。

提供程序实施所用的消息传递模式决定了请求和响应消息中包含的特定信息的绑定量。使用消息模式的实现会接收所有绑定器和标头,以及请求。它们还必须将所有绑定程序和标头添加到响应消息。使用有效负载模式的实现仅接收请求的正文。使用有效负载模式返回的 XML 文档被放入请求消息的正文中。

例子

例 41.11 “provider<SOAPMessage> 实现” 显示一个供应商实施,用于消息模式的 SOAPMessage 对象。

例 41.11. provider<SOAPMessage> 实现

import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;

@WebServiceProvider(portName="stockQuoteReporterPort"
                    serviceName="stockQuoteReporter")
@ServiceMode(value="Service.Mode.MESSAGE")
public class  stockQuoteReporterProvider implements Provider<SOAPMessage>
{
public stockQuoteReporterProvider()
  {
  }

public SOAPMessage invoke(SOAPMessage request)
  {
  SOAPBody requestBody = request.getSOAPBody();
  if(requestBody.getElementName.getLocalName.equals("getStockPrice"))
    {
    MessageFactory mf = MessageFactory.newInstance();
      SOAPFactory sf = SOAPFactory.newInstance();

    SOAPMessage response = mf.createMessage();
      SOAPBody respBody = response.getSOAPBody();
      Name bodyName = sf.createName("getStockPriceResponse");
      respBody.addBodyElement(bodyName);
      SOAPElement respContent = respBody.addChildElement("price");
      respContent.setValue("123.00");
      response.saveChanges();
    return response;
    }
    ...
  }
}

例 41.11 “provider<SOAPMessage> 实现” 中的代码执行以下操作:

指定以下类实施实施实施服务(其 wsdl:service 元素名为 stockQuoteReporter )的 Provider 对象,其 wsdl:port 元素名为 stockQuoteReporterPort

指定此提供程序实施使用消息模式。

提供所需的默认公共构造器。

提供 调用()方法的 实现,它采用 SOAPMessage 对象并返回 SOAPMessage 对象。

从传入 SOAP 消息的正文中提取请求消息。

检查请求消息的根元素,以确定如何处理请求。

创建构建响应所需的工厂。

为响应构建 SOAP 消息。

将响应返回为 SOAPMessage 对象。

例 41.12 “provider<DOMSource> 实施” 显示在有效负载模式中使用 DOMSource 对象进行提供程序实施的示例。

例 41.12. provider<DOMSource> 实施

import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceProvider;

@WebServiceProvider(portName="stockQuoteReporterPort" serviceName="stockQuoteReporter")
@ServiceMode(value="Service.Mode.PAYLOAD")
public class  stockQuoteReporterProvider implements Provider<DOMSource>
public stockQuoteReporterProvider()
  {
  }

public DOMSource invoke(DOMSource request)
  {
    DOMSource response = new DOMSource();
    ...
    return response;
  }
}

例 41.12 “provider<DOMSource> 实施” 中的代码执行以下操作:

指定该类实施了实施服务(其 wsdl:service 元素名为 stockQuoteReporter )的 Provider 对象,其 wsdl:port 元素名为 stockQuoteReporterPort

指定此提供程序实施使用有效负载模式。

提供所需的默认公共构造器。

提供 调用() 方法的实施,该方法采用 DOMSource 对象并返回 DOMSource 对象。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.