42.3. 在 Consumer Implementation 中使用上下文


概述

消费者实施可通过 BindingProvider 接口访问上下文信息。BindingProvider 实例在两个独立上下文中包含上下文信息:

  • 请求上下文 请求上下文 允许您设置影响出站消息的属性。请求上下文属性应用到特定的端口实例,并且设置后,属性会影响端口上进行的每个操作调用,直到这些时间明确清除。例如,您可以使用 request context 属性来设置连接超时,或者初始化在标头中发送的数据。
  • 响应上下文 响应上下文 允许您读取响应从当前线程发出的最后一个操作调用所设置的属性值。每次操作调用后都会重置响应上下文属性。例如,您可以访问响应上下文属性,以读取从最后一个入站消息接收的标头信息。
重要

只有放置在消息上下文的应用程序范围内的信息才可以被消费者实施访问。

获取上下文

使用 javax.xml.ws.BindingProvider 接口获取上下文。BindingProvider 接口有两个获取上下文的方法:

  • getRequestContext() 例 42.7 “getRequestContext () 方法” 中显示的 getRequestContext () 方法将请求上下文返回为 Map 对象。返回的 Map 对象可用于直接操作上下文的内容。

    例 42.7. getRequestContext () 方法

    Map<String, Object&gt;getRequestContext

  • getResponseContext() 例 42.8 “getResponseContext () 方法” 中显示的 getResponseContext () 将响应上下文返回为 Map 对象。返回的 Map 对象的内容反映了响应上下文内容的状态,来自当前线程中进行的远程服务的最新成功请求。

    例 42.8. getResponseContext () 方法

    Map<String, Object>getResponseContext

由于代理对象实现 BindingProvider 接口,因此可以通过广播代理对象来获取 BindingProvider 对象。从 BindingProvider 对象获取的上下文仅对用于创建它的代理对象调用的操作有效。

例 42.9 “获取 Consumer 的 Request 上下文” 显示获取代理请求上下文的代码。

例 42.9. 获取 Consumer 的 Request 上下文

// 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 > 对象中的哈希映射。映射的键是 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 在消费者实现中支持以下上下文属性:

表 42.2. 消费者上下文属性
属性名称描述

javax.xml.ws.BindingProvider

ENDPOINT_ADDRESS_PROPERTY

指定目标服务的地址。该值存储为 String

USERNAME_PROPERTY[a]

指定用于 HTTP 基本身份验证的用户名。该值存储为 String

PASSWORD_PROPERTY[b]

指定用于 HTTP 基本身份验证的密码。该值存储为 String

SESSION_MAINTAIN_PROPERTY[c]

指定客户端是否希望维护会话信息。该值作为 布尔值对象存储

org.apache.cxf.ws.addressing.JAXWSAConstants

CLIENT_ADDRESSING_PROPERTIES

指定消费者用来联系所需服务提供商的 WS-寻址信息。该值存储为 org.apache.cxf.ws.addressing.AddressingProperties

org.apache.cxf.transports.jms.context.JMSConstants

JMS_CLIENT_REQUEST_HEADERS

包含消息的 JMS 标头。如需更多信息,请参阅 第 42.4 节 “使用 JMS 消息属性”

[a] 此属性被 HTTP 安全设置中定义的用户名覆盖。
[b] 此属性被 HTTP 安全设置中定义的密码覆盖。
[c] Apache CXF 忽略此属性。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.