Web Service 寻址 (WS-Addressing) 通过定义用来对 Web Service 进行寻址和在消息中提供寻址信息的标准方法,帮助实现 Web Service 之间的互操作性。本任务描述了创建使用 WS-Addressing 端点引用访问的 JAX-WS Web Service 所需的步骤。该任务还描述了其他步骤,在将有状态资源用作 Web Service 的一部分时需要执行这些步骤。
开始之前
本任务中描述的步骤适用于在 WebSphere® Application Server 上运行的服务器和客户机。
关于此任务
如果要创建使用 WS-Addressing 规范的 JAX-WS Web Service,请完成此任务。此任务使用 JAX-WS
WS-Addressing API 来创建所需的端点引用。
另外,可以使用 IBM 专有 WS-Addressing API 来创建端点引用,并将它们转换为 JAX-WS API 对象,以供应用程序的剩余部分使用。
过程
- 提供将端点引用返回到目标服务的 Web Service 接口。
该接口必须返回端点引用,您可以通过使用工厂操作或单个的工厂服务来完成本任务。目标服务可以面向资源实例,例如,购物车。
- 实现在前一步骤中创建的 Web Service。对于实现的 WS-Addressing 部分,请完成以下步骤:
- 可选: 包含注释以指定 WS-Addressing 行为。请参阅Web Service 寻址注释,以了解更多详细信息。
- 可选: 如果接口包括面向资源实例的 Web Service,请创建或查找该资源实例。
- 可选: 如果使用资源实例,请获取该资源的标识。 该资源标识依赖于应用程序,可能是在创建资源实例期间生成的。
注意: 由于将在 SOAP 消息中传播标识,所以不要将敏感信息放在资源标识中。
- 通过遵循使用 JAX-WS Web Service 寻址 API 创建端点引用中的指示信息来创建引用 Web Service 的端点引用。如果使用资源实例,请在资源标识中将其作为参数进行传递。
- 返回端点引用。
- 如果 Web Service 使用了资源实例,那么扩展实现以使入局消息与适当的资源实例匹配。 因为已使该资源标识与先前创建的端点引用相关联,所以在该端点引用上确定的任何目标入局消息都将包含资源标识信息,作为消息 SOAP 头中的引用参数。因为在 SOAP 头中传递资源标识,所以不必在 Web Service 接口上公开资源标识。当 WebSphere Application Server 收到消息时,它会将此信息放入线程上的消息上下文中。请扩展该实现以执行以下操作:
- 从消息上下文获取资源实例标识。
- 如果正在使用 2005/08 WS-Addressing 名称空间,请使用 MessageContext 类的 REFERENCE_PARAMETERS 属性。
- 如果正在使用 2004/08 WS-Addressing 名称空间,那么必须使用 IBM WS-Addressing API,特别是 EndpointReferenceManager.getReferenceParameterFrom
MessageContext(QName resource_id) 方法。
使用 2005/08 名称空间的以下方法:...
List resourceIDList = (List)getContext().getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);
...
使用 2004/08 名称空间的以下方法:...
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
...
- 将消息转发至适当的资源实例。
- 可选: 配置代理客户机以与服务通信。
- 使用 wsimport 或 xjc 工具以生成客户机所需的工件。
注: 如果要使用 2004/08 WS-Addressing 规范,请将提供的绑定文件 app_server_root/util/SubmissionEndpointReference.xjb 指定为此工具的 -b 参数。此参数告知工具使用属于标准 JAX-WS API 的 IBM 实现的 SubmissionEndpointReference 类来生成端点引用对象。如果不指定此绑定文件,那么生成的端点引用对象将不会使用标准 JAX-WS API。
- 在客户机代码中,创建服务类的实例。
- 从服务类获取代理对象。 可通过多种方法,使用 JAX-WS API 来获取代理对象。
例如,在服务类上有多个 getPort 方法,而在 EndpointReference 类上只有一个此方法。有关更多信息,请参阅 API 文档。
- 可选: 使用寻址功能部件或 SubmissionAddressing 功能部件来启用 WS-Addressing 支持。 例如,使用将 Web Service 功能部件作为参数接受的 getPort 方法来创建代理。如果愿意,那么可以使用另一种方法(例如,策略集)来启用 WS-Addressing 支持。有关更多信息,请参阅为 JAX-WS 应用程序启用 Web Service 寻址支持。
- 使用代理对象来调用返回端点引用的服务方法。
以下样本代码显示调用 Web Service 来将两个数字加在一起的客户机。Web Service 向客户机发出凭单(资源标识)并要求客户机在调用 Web Service 时使用此凭单。
客户机创建两个代理。第一个代理从服务获取作为端点引用的凭单。第二个代理使用 AddressingFeature 类来为 2005/08 规范启用 WS-Addressing,并调用此服务来将两个数字加在一起。
...
CalculatorService service = new CalculatorService();
// Create the first proxy
Calculator port1 = service.getCalculatorServicePort();
// Obtain the ticket as an endpoint reference from the service
W3CEndpointReference epr = port1.getTicket();
// Create the second proxy, using an addressing feature to enable WS-Addressing
Calculator port2 = epr.getPort(Calculator.class, new AddressingFeature());
// Invoke the service to add the numbers
int answer = port2.add(value0, value1);
System.out.println("The answer is: " + answer);
...
注: 如果端点引用的元数据与出站消息所关联的信息冲突(例如,如果代理对象配置为表示不同接口),那么在尝试调用端点时将抛出 javax.xml.ws.WebServiceException 异常。
如果要设置消息寻址属性(例如,对端点的应答),您必须使用 IBM 专有 WS-Addressing SPI 和 BindingProvider 类,如使用 IBM 专有 Web Service 寻址 SPI 指定和获取消息寻址属性中所述。
- 可选: 配置 Dispatch 客户机以与服务通信。 可以通过不同的方式配置客户机;以下步骤描述了一个示例。
- 创建服务的实例。
- 将端口添加到服务对象。
- 创建 Dispatch 类的实例,传入端点引用。
- 创建 Dispatch 对象。 使用带以下参数的 Service.createDispatch 方法:
Service.createDispatch 方法有多个变体;请参阅 API 文档以获取更多详细信息。
- 编写客户机请求消息。
- 使用 Dispatch 客户机调用服务端点。
以下代码显示了启用 2004/08 WS-Addressing 的 Dispatch 客户机的示例片段。...
CalculatorService service = new CalculatorService();
Dispatch(<SOAPMessage> dispatch = service.createDispatch(
endpointReference,
SOAPMessage.class,
Service.Mode.MESSAGE,
new SubmissionAddressingFeature(true));
...