42.3. 在消费者实现中使用上下文
概述
消费者实施可以通过 BindingProvider 接口访问上下文信息。BindingProvider 实例在两个独立上下文中保存上下文信息:
只有放置在消息上下文的应用范围中的信息才可以被消费者实施来访问。
获取上下文
上下文可以使用 javax.xml.ws.BindingProvider 接口获得。BindingProvider 接口有两种方法来获取上下文:
getRequestContext()
getRequestContext()
方法(如 例 42.7 “getRequestContext()
方法” 所示)将请求上下文返回为Map
对象。返回的Map
对象可用于直接操作上下文的内容。例 42.7.
getRequestContext()
方法map<String, Object>
;getRequestContext
getResponseContext()
getResponseContext()
如 例 42.8 “getResponseContext()
方法” 所示,将响应上下文返回为Map
对象。returnedMap
对象的内容反映了响应上下文的内容,来自当前线程中发出的远程服务的最新成功请求。例 42.8.
getResponseContext()
方法map<String, Object>
;getResponseContext
由于代理对象实施 BindingProvider 接口,因此可通过广播代理对象获取 BindingProvider 对象。从 BindingProvider 对象获取的上下文仅适用于用于创建它的代理对象上调用的操作。
例 42.9 “获取消费者的请求上下文” 显示获取代理请求上下文的代码。
例 42.9. 获取消费者的请求上下文
// Proxy widgetProxy obtained previously BindingProvider bp = (BindingProvider)widgetProxy; Map<String, Object> requestContext = bp.getRequestContext();
从上下文读取属性
消费者上下文存储在 java.util.Map<String, Object>
对象中。该映射包含包含任意对象的 String
对象的键和值。使用 java.util.Map.get()
访问响应上下文属性映射中的条目。
要检索特定的上下文属性 ContextPropertyName,请使用 例 42.10 “读取响应上下文属性” 中显示的代码。
例 42.10. 读取响应上下文属性
// Invoke an operation. port.SomeOperation(); // Read response context property. java.util.Map<String, Object> responseContext = ((javax.xml.ws.BindingProvider)port).getResponseContext(); PropertyType propValue = (PropertyType) responseContext.get(ContextPropertyName);
在上下文中设置属性
使用者上下文是存储在 java.util.Map<String, Object
> 对象中的 hash map。该映射包含 String
对象和值为任意对象的键。要在上下文中设置属性,请使用 java.util.Map.put()
方法。
虽然您可以在请求上下文和响应上下文中设置属性,但仅对请求上下文所做的更改对消息处理产生任何影响。当当前线程上完成各个远程调用时,响应上下文中的属性会重置。
例 42.11 “设置请求上下文属性” 中显示的代码通过设置 BindingProvider.ENDPOINT_ADDRESS_PROPERTY 的值来更改目标服务提供商的地址。
例 42.11. 设置请求上下文属性
// Set request context property. java.util.Map<String, Object> requestContext = ((javax.xml.ws.BindingProvider)port).getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/widgets"); // Invoke an operation. port.SomeOperation();
在请求上下文中设置某个属性后,其值将用于所有后续远程调用。您可以更改值,然后使用更改的值。
支持的上下文
Apache CXF 在消费者实施中支持以下上下文属性:
属性名称 | 描述 |
---|---|
| |
ENDPOINT_ADDRESS_PROPERTY |
指定目标服务的地址。该值存储为 |
USERNAME_PROPERTY[a] |
指定用于 HTTP 基本身份验证的用户名。该值存储为 |
PASSWORD_PROPERTY[b] |
指定用于 HTTP 基本身份验证的密码。该值存储为 |
SESSION_MAINTAIN_PROPERTY[c] |
指定客户端是否希望维护会话信息。该值存储为 |
| |
CLIENT_ADDRESSING_PROPERTIES |
指定消费者用来联系所需服务提供商的 WS-Addressing 信息。该值存储为 |
| |
JMS_CLIENT_REQUEST_HEADERS | 包含消息的 JMS 标头。更多信息请参阅 第 42.4 节 “使用 JMS 消息属性”。 |
[a]
此属性将被 HTTP 安全设置中定义的用户名覆盖。
[b]
此属性将被 HTTP 安全设置中定义的密码覆盖。
[c]
Apache CXF 忽略此属性。
|