第 42 章 使用上下文

摘要

JAX-WS 使用上下文将元数据与消息传递链传递。此元数据取决于其范围,可用于实施级别代码。它还可访问在实施级别以下消息的 JAX-WS 处理程序。

42.1. 了解上下文

概述

在很多实例中,需要将有关消息的信息传递给应用程序的其他部分。Apache CXF 使用上下文机制进行此操作。上下文是保存与传出或传入消息相关的属性的映射。上下文中存储的属性通常是有关消息的元数据,以及用于发送消息的底层传输。例如,传输消息的传输特定标头(如 HTTP 响应代码或 JMS 关联 ID)存储在 JAX-WS 上下文中。

上下文在所有级别上提供了 JAX-WS 应用。但是,它们根据您要访问上下文的消息处理堆栈中的方式有所不同。JAX-WS 处理程序实施可以直接访问上下文,并可访问他们中设置的所有属性。服务实施通过注入后访问上下文,只能访问在 APPLICATION 范围内设置的属性。消费者实施只能访问在 APPLICATION 范围内设置的属性。

图 42.1 “消息上下文和消息处理路径” 显示上下文属性如何通过 Apache CXF 传递。当通过消息传递链的消息传递时,其关联的消息上下文会随其一起传递。

图 42.1. 消息上下文和消息处理路径

通过客户端和服务器消息处理链可使用消息上下文

如何将属性存储在上下文中

message 上下文是 javax.xml.ws.handler.MessageContext 接口的所有实现。MessageContext 接口扩展了 java.util.Map<String 键, Object value> 接口。将对象存储信息映射为键值对。

在消息上下文中,属性存储为名称/值对。属性的密钥是用于标识属性的 String。属性的值可以是存储在任何 Java 对象中的任何值。当值从消息上下文返回时,应用必须知道要期望的类型并相应地进行多播。例如,如果属性的值存储在 UserInfo 对象中,它仍然会从消息上下文返回,作为对象对象,则必须转换回 UserInfo 对象。

消息上下文中的属性也具有范围。范围决定在消息处理链中可以访问属性的位置。

属性范围

消息上下文中的属性具有作用域。属性可以处于以下范围之一:

应用
属性范围为 APPLICATION 可供 JAX-WS Handler 实施、消费者实施代码和服务提供商实施代码使用。如果处理程序需要将属性传递到服务提供商实施,它会将属性的范围设置为 APPLICATION。从消费者实施或服务提供商实施上下文上设置的所有属性自动作为 应用的范围
处理程序
属性范围为 HANDLER 仅可用于 JAX-WS Handler 实施。默认情况下,存储在 Handler 实施的消息上下文中属性将限定为 HANDLER

您可以使用消息上下文的 setScope() 方法更改属性的范围。例 42.1 “MessageContext.setScope() 方法” 显示方法的签名。

例 42.1. MessageContext.setScope() 方法

setScopeStringkeyMessageContext.Scopescopejava.lang.IllegalArgumentException

first 参数指定属性的密钥。第二个参数指定属性的新范围。范围可以是:

  • MessageContext.Scope.APPLICATION
  • MessageContext.Scope.HANDLER

处理程序中上下文概述

实施 JAX-WS Handler 接口的类能够直接访问消息的上下文信息。消息的上下文信息传递到 Handler 实施的 handleMessage()、handle Fault()close() 方法。

处理程序实施可以访问消息上下文中存储的所有属性,而不考虑它们的范围。另外,逻辑处理程序使用专用的消息上下文,名为 LogicalMessageContextLogicalMessageContext 对象具有访问消息正文内容的方法。

服务实现中的上下文概述

服务实施可从消息上下文访问范围为 APPLICATION 的属性。服务提供商的实现对象通过 WebServiceContext 对象访问消息上下文。

更多信息请参阅 第 42.2 节 “在服务实现中使用上下文”

消费者实施中的上下文概述

消费者实施可以间接访问消息上下文的内容。消费者实施有两个独立的消息上下文:

  • 请求上下文 - 保留用于传出请求的属性副本
  • 响应上下文 - 包含来自传入响应的属性副本

分配层传输消费者实施的消息上下文和处理程序使用的消息上下文之间的属性。

当请求从消费者实施传递到 allocated 层时,请求上下文的内容将复制到被分配层使用的消息上下文中。当从服务返回响应时,分配层将处理消息,并将适当的属性设置为其消息上下文。在分配层处理响应后,它会将所有属性范围都作为 APPLICATION 在其消息上下文中复制到消费者实施的响应上下文。

更多信息请参阅 第 42.3 节 “在消费者实现中使用上下文”