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 ()
方法
公共静态服务创建
URL
wsdlLocation
QName
serviceName
WebServiceExceptionpublic 静态Service
create
QName
serviceName
WebServiceException
serviceName
参数的值是一个 QName。其命名空间部分的值是服务的目标命名空间。服务的目标命名空间在 @WebService
注解的 targetNamespace
属性中指定。QName 的本地部分的值是 wsdl:service
元素的 name
属性的值。您可以使用以下方法之一确定这个值: .它在 @WebService
注释的 serviceName
属性中指定。
-
您可以将
Service
附加到@WebService
注释的name
属性的值。 -
您可以将
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 合同的任何依赖项。