25.2. 创建服务对象


概述

javax.xml.ws.Service 类代表 wsdl:service 元素,其中包含公开服务的所有端点的定义。因此,它提供允许您获取由 wsdl:port 元素定义的端点的方法,它们是在服务上执行远程调用的代理。

注意

Service 类提供抽象,允许客户端代码与 Java 类型一起使用,而不是使用 XML 文档。

create ()方法

Service 类有两个静态 create () 方法,可用于创建新 Service 对象。如 例 25.1 “service create () 方法” 所示,两个 create () 方法都使用 wsdl:service 元素的 QName,Service 对象将代表,另一个采用指定 WSDL 合同位置的 URI。

注意

所有服务都会发布其 WSDL 合同。对于 SOAP/HTTP 服务,URI 通常是附加 ?wsdl 的服务的 URI。

例 25.1. service create () 方法

公共静态服务创建URLwsdlLocationQNameserviceNameWebServiceExceptionpublic 静态ServicecreateQNameserviceNameWebServiceException

serviceName 参数的值是一个 QName。其命名空间部分的值是服务的目标命名空间。服务的目标命名空间在 @WebService 注解的 targetNamespace 属性中指定。QName 的本地部分的值是 wsdl:service 元素的 name 属性的值。您可以使用以下方法之一确定这个值: .它在 @WebService 注释的 serviceName 属性中指定。

  1. 您可以将 Service 附加到 @WebService 注释的 name 属性的值。
  2. 您可以将 Service 附加到 SEI 的名称。
重要

在 OSGi 环境中以编程方式创建的 CXF 消费者需要特殊处理,以避免发生发生 类NotFoundException的可能性。对于包含以编程方式创建的 CXF 用户的每个捆绑包,您需要创建一个单例 CXF 默认总线,并确保所有捆绑包的 CXF 用户都使用它。如果没有这种保护,可以分配在另一个捆绑包中创建的 CXF 默认总线,这可能会导致继承捆绑包失败。

例如,假设捆绑包 A 没有明确设置 CXF 默认总线,并在捆绑包 B 中分配 CXF 默认总线。如果捆绑包 A 中的 CXF 总线需要配置额外的功能(如 SSL 或 WS-Security),或者需要从捆绑包 A 中加载某些类或资源,它将会失败。这是因为 CXF 总线实例将线程上下文类加载程序(TCCL)设置为创建它的捆绑包的捆绑类加载程序(本例中为 bundle B)。此外,某些框架,如 wss4j ( CXF 中的 WS-Security)使用 TCCL 加载资源,如 calback 处理程序类或其他属性文件(捆绑包内部)。因为捆绑包 A 被分配 B 的默认 CXF 总线,并且是 TCCL,wss4j 层无法从捆绑包 A 加载所需资源,这会导致 ClassNotFoundException 错误。

要创建单例 CXF 默认总线,请将此代码插入到创建服务对象的 方法的开头,如 “Example”一节 所示:

BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());

Example

例 25.2 “创建服务 对象” 显示为 例 24.7 “完全解析的 SEI” 中显示的 SEI 创建 Service 对象的代码。

例 25.2. 创建服务 对象

package com.fusesource.demo;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class Client
{
public static void main(String args[])
  {
    BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());
    QName serviceName = new QName("http://demo.redhat.com", "stockQuoteReporter");
    Service s = Service.create(serviceName);
   ...
  }
}

例 25.2 “创建服务 对象” 中的代码执行以下操作:

创建一个单例 CXF 默认总线,供服务的所有 CXF 用户使用。

使用 targetNamespace 属性和 @WebService 注释的 name 属性为服务构建 QName。

调用单个参数 create () 方法来创建新 Service 对象。

注意

使用单个参数 create () 可为您取消对访问 WSDL 合同的任何依赖项。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.