第 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. 消息上下文和消息处理路径
属性如何存储在上下文中
消息上下文是 javax.xml.ws.handler.MessageContext 接口的所有实现。MessageContext 接口扩展了 java.util.Map<String 键,Object value> 接口。将信息映射为键值对。
在消息上下文中,属性存储为名称/值对。属性的键是用于标识属性的字符串。属性的值可以是存储在任何 Java 对象中的任何值。当从消息上下文返回该值时,应用程序必须知道要相应地预期和广播的类型。例如,如果属性的值存储在
UserInfo
对象中,它仍然从消息上下文返回,作为必须回回到 UserInfo
对象的对象对象。
消息上下文中的属性也具有范围。范围决定了在消息处理链中可以访问属性的位置。
属性值
应用
-
属性称为
APPLICATION
,可用于 JAX-WS 处理程序实施、消费者实施代码和服务提供商实施代码。如果处理程序需要将属性传递给服务提供商实施,它会将属性的作用域设置为APPLICATION
。从使用者实施或服务提供商实施上下文设置的所有属性都会作为APPLICATION
自动限定。 HANDLER
-
属性称为
HANDLER
仅适用于 JAX-WS 处理程序。默认情况下,处理程序实施存储在消息上下文中的属性被限定为HANDLER
。
您可以使用消息上下文的 setScope ()
方法来更改属性的范围。例 42.1 “The MessageContext.setScope()
Method” 显示方法的签名。
例 42.1. The MessageContext.setScope()
Method
setScope
String
key
MessageContext.Scope
scope
java.lang.IllegalArgumentException
第一个参数指定属性的密钥。第二个参数指定属性的新范围。范围可以是:
-
MessageContext.Scope.APPLICATION
-
MessageContext.Scope.HANDLER
处理程序中的上下文概述
实施 JAX-WS Handler 接口的类可以直接访问消息的上下文信息。消息的上下文信息将传递到 Handler 实施的 handleMessage ()
、handleFault ()
和 close ()
方法。
处理程序实施能够访问消息上下文中存储的所有属性,无论其范围如何。另外,逻辑处理程序使用专用的消息上下文,称为 LogicalMessageContext
。LogicalMessageContext
对象具有访问消息正文内容的方法。
服务实现中的上下文概述
服务实施可作为来自消息上下文 的应用
访问属性。服务提供商的实施对象通过 WebServiceContext 对象访问消息上下文。
更多信息请参阅 第 42.2 节 “在服务实现中使用上下文”。
用户实施中的上下文概述
消费者实施可以间接访问消息上下文的内容。使用者实施有两个不同的消息上下文:
- 请求上下文 - 保存用于传出请求的属性副本
- 响应上下文 - 包含来自传入响应的属性副本
分配层会传输消费者实施的消息上下文和处理程序实施所使用的消息上下文之间的属性。
从消费者实施传递请求到分配层时,请求上下文的内容将复制到由分配层使用的消息上下文中。从服务返回响应时,分配层会处理消息,并将适当的属性设置为其消息上下文。在分配层处理响应后,它会将所有属性范围作为 APPLICATION
复制到消费者实施的响应上下文。
更多信息请参阅 第 42.3 节 “在消费者实现中使用上下文”。