第 42 章 使用上下文
摘要
JAX-WS 使用上下文在消息传递链中传递元数据。此元数据取决于其范围,可以被实施级别代码访问。也可以被 JAX-WS 处理程序访问,这些处理程序在实施级别下的消息上运行。
42.1. 了解上下文
概述
在很多实例中,需要将有关消息的信息传递给应用程序的其他部分。Apache CXF 使用上下文机制进行此操作。上下文是包含与传出或传入消息相关的属性的映射。上下文中存储的属性通常是有关消息的元数据,以及用于通信消息的底层传输。例如,用于传输消息的传输特定标头(如 HTTP 响应代码或 JMS 关联 ID)存储在 JAX-WS 上下文中。
该上下文位于 JAX-WS 应用的所有级别。但是,它们根据您在消息处理堆栈中访问上下文的位置而有所不同。JAX-WS Handler 实施可直接访问上下文,并可以访问它们中设置的所有属性。服务实现通过注入来访问上下文,并且只能访问 APPLICATION
范围内设置的属性。消费者实施只能访问应用程序范围内 设置的属性
。
图 42.1 “消息上下文和消息处理路径” 显示上下文属性如何通过 Apache CXF 传递。当消息通过消息传递链时,其关联的消息上下文会随其一起传递。
图 42.1. 消息上下文和消息处理路径
属性如何在上下文中存储
消息上下文是 javax.xml.ws.handler.MessageContext 接口的所有实现。MessageContext 接口扩展了 java.util.Map<String key, Object value> 接口。将信息映射为键值对。
在消息上下文中,属性作为名称/值对存储。属性的键是用于标识 属性
的字符串。属性的值可以是存储在任何 Java 对象中的任何值。当从消息上下文返回值时,应用程序必须知道类型才会预期并相应地进行 cast。例如,如果属性的值存储在 UserInfo
对象中,它仍然会从消息上下文返回,该对象需要重新转换为 UserInfo
对象。
消息上下文中的属性也具有范围。范围决定了消息处理链中可以访问属性的位置。
属性范围
应用
-
将属性范围为
APPLICATION
可用于 JAX-WS Handler 实施、消费者实施代码和服务提供商实施代码。如果处理程序需要将属性传递给服务提供商实施,它会将属性的范围设置为APPLICATION
。从消费者实施或服务提供商实施上下文设置的所有属性都自动限定为APPLICATION
。 HANDLER
-
属性范围为
HANDLER
仅适用于 JAX-WS Handler 实施。默认情况下,存储在处理程序实施的消息上下文中的属性被限定为HANDLER
。
您可以使用消息上下文的 setScope ()
方法更改属性的范围。例 42.1 “MessageContext.setScope ()
方法” 显示方法的签名。
例 42.1. MessageContext.setScope ()
方法
setScope
String
key
MessageContext.Scope
scope
java.lang.IllegalArgumentException
第一个参数指定属性的键。第二个参数指定属性的新范围。范围可以是:
-
MessageContext.Scope.APPLICATION
-
MessageContext.Scope.HANDLER
处理程序中的上下文概述
实施 JAX-WS Handler 接口的类可以直接访问消息的上下文信息。消息的上下文信息被传递给处理程序实现的 handleMessage ()
、handleFault ()
和 close ()
方法。
处理程序实现有权访问消息上下文中存储的所有属性,无论其范围如何。此外,逻辑处理程序使用称为 LogicalMessageContext
的专用消息上下文。LogicalMessageContext
对象具有访问消息正文内容的方法。
服务实现中的上下文概述
服务实现可以访问范围为来自 消息
上下文的属性。服务提供商的实施对象通过 WebServiceContext 对象访问消息上下文。
如需更多信息,请参阅 第 42.2 节 “在服务实施中使用上下文”。
消费者实现中的上下文概述
消费者实施具有对消息上下文内容的间接访问权限。消费者实现有两个单独的消息上下文:
- Request context - 包含用于传出请求的属性副本
- 响应上下文 - 包含来自传入响应的属性副本
分配层在消费者实施的消息上下文和由处理程序实施使用的消息上下文之间传输属性。
当从消费者实施传递给分配层时,请求上下文的内容将复制到分配层使用的消息上下文中。从服务返回响应时,分配层将处理消息,并将适当的属性设置为消息上下文。在分配层处理响应后,它会将消息上下文中的所有属性限定为 APPLICATION
,到消费者实施的响应上下文。
如需更多信息,请参阅 第 42.3 节 “在 Consumer Implementation 中使用上下文”。