42.2. 在服务实施中使用上下文


概述

使用 WebServiceContext 接口将上下文信息提供给服务实现。您可以从 WebServiceContext 对象获取 MessageContext 对象,该对象使用应用范围内当前请求的上下文属性填充。您可以操作 属性的值,并通过响应链传播它们。

注意

MessageContext 接口继承自 java.util.Map 接口。它的内容可以使用 Map 接口的方法进行操作。

获取上下文

要在服务实现中获取消息上下文,请执行以下操作:

  1. 声明类型为 WebServiceContext 的变量。
  2. 使用 javax.annotation.Resource 注释减少变量,以指示上下文信息被注入到 变量中。
  3. 使用 get MessageContext () 方法从 WebServiceContext 对象获取 MessageContext 对象。

    重要

    getMessageContext () 只能用于使用 @WebMethod 注释。

例 42.2 “在服务实施中获取上下文对象” 显示获取上下文对象的代码。

例 42.2. 在服务实施中获取上下文对象

import javax.xml.ws.*;
import javax.xml.ws.handler.*;
import javax.annotation.*;

@WebServiceProvider
public class WidgetServiceImpl
{
  @Resource
  WebServiceContext wsc;

  @WebMethod
  public String getColor(String itemNum)
  {
    MessageContext context = wsc.getMessageContext();
  }

  ...
}

从上下文读取属性

获取适用于您的实现的 MessageContext 对象后,您可以使用 例 42.3 “MessageContext.get () 方法” 中显示的 get () 方法访问存储的属性。

例 42.3. MessageContext.get () 方法

vgetObjectkey

注意

get () 继承自 Map 接口。

key 参数是代表您要从上下文检索的属性的字符串。get () 返回必须转换为属性的正确类型的对象。表 42.1 “服务实施上下文中提供的属性” 列出服务实施上下文中可用的多个属性。

重要

更改从上下文返回的对象的值也会更改上下文中的属性值。

例 42.4 “从服务的消息上下文获取属性” 显示获取代表调用操作的 WSDL 操作 元素名称的代码。

例 42.4. 从服务的消息上下文获取属性

import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.message.Message;

  ...
  // MessageContext context retrieved in a previous example
  QName wsdl_operation = (QName)context.get(Message.WSDL_OPERATION);

在上下文中设置属性

获取适用于您的实现的 MessageContext 对象后,您可以使用 例 42.5 “MessageContext.put () 方法” 中显示的 put () 方法设置属性并更改现有属性。

例 42.5. MessageContext.put () 方法

vputKkeyVvalueClassCastExceptionIllegalArgumentExceptionNullPointerException

如果在消息上下文中已存在设置的属性,则 put () 方法将现有值替换为新值并返回旧值。如果消息上下文中不存在该属性,则 put () 方法将设置属性并返回 null

例 42.6 “在服务的消息上下文中设置属性” 显示用于为 HTTP 请求设置响应代码的代码。

例 42.6. 在服务的消息上下文中设置属性

import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.message.Message;

  ...
  // MessageContext context retrieved in a previous example
  context.put(Message.RESPONSE_CODE, new Integer(404));

支持的上下文

表 42.1 “服务实施上下文中提供的属性” 列出通过服务实施对象中上下文访问的属性。

表 42.1. 服务实施上下文中提供的属性
属性名称描述

org.apache.cxf.message.Message

PROTOCOL_HEADERS[a]

指定特定于传输的标头信息。该值存储为 java.util.Map<String, List<String>>

RESPONSE_CODE

指定返回到消费者的响应代码。该值存储为一个 Integer 对象。

ENDPOINT_ADDRESS

指定服务提供商的地址。该值存储为 String

HTTP_REQUEST_METHOD

指定通过请求发送的 HTTP 动词。该值存储为 String

PATH_INFO

指定正在请求的资源的路径。该值存储为 String

该路径是主机名后 URI 的部分,并在任何查询字符串之前。例如,如果端点的 URI 是 http://cxf.apache.org/demo/widgets,则路径为 /demo/widgets

QUERY_STRING

指定附加到用于调用请求的 URI 的查询(若有)。该值存储为 String

在 URI 的末尾,查询会出现在 URI 的末尾,。例如:如果向 http://cxf.apache.org/demo/widgets?color 发出了一个请求,则查询为 颜色

MTOM_ENABLED

指定服务提供商是否可以将 MTOM 用于 SOAP 附加。该值存储为 布尔值

SCHEMA_VALIDATION_ENABLED

指定服务提供商是否针对 schema 验证信息。该值存储为 布尔值

FAULT_STACKTRACE_ENABLED

指定运行时是否提供堆栈追踪以及错误消息。该值存储为 布尔值

CONTENT_TYPE

指定消息的 MIME 类型。该值存储为 String

BASE_PATH

指定正在请求的资源的路径。该值存储为 java.net.URL

该路径是主机名后 URI 的部分,并在任何查询字符串之前。例如,如果端点的 URL 是 http://cxf.apache.org/demo/widgets,基本路径为 /demo/widgets

编码

指定消息的编码。该值存储为 String

FIXED_PARAMETER_ORDER

指定参数是否必须以特定顺序显示在消息中。该值存储为 布尔值

MAINTAIN_SESSION

指定消费者是否希望为将来的请求维护当前会话。该值存储为 布尔值

WSDL_DESCRIPTION

指定定义所实施服务的 WSDL 文档。该值存储为 org.xml.sax.InputSource 对象。

WSDL_SERVICE

指定定义所实施服务的 wsdl:service 元素的合格名称。该值存储为 QName

WSDL_PORT

指定 wsdl:port 元素的合格名称,用于定义用于访问该服务的端点。该值存储为 QName

WSDL_INTERFACE

指定定义所实施服务的 wsdl:portType 元素的合格名称。该值存储为 QName

WSDL_OPERATION

指定与消费者调用的操作对应的 wsdl:operation 元素的合格名称。该值存储为 QName

javax.xml.ws.handler.MessageContext

MESSAGE_OUTBOUND_PROPERTY

指定消息是否出站。该值存储为 布尔值true 指定消息是出站的。

INBOUND_MESSAGE_ATTACHMENTS

包含请求消息中包含的任何附件。该值存储为 java.util.Map<String, DataHandler >。

映射的键值是标头的 MIME Content-ID。

OUTBOUND_MESSAGE_ATTACHMENTS

包含响应消息的任何附件。该值存储为 java.util.Map<String, DataHandler >。

映射的键值是标头的 MIME Content-ID。

WSDL_DESCRIPTION

指定定义所实施服务的 WSDL 文档。该值存储为 org.xml.sax.InputSource 对象。

WSDL_SERVICE

指定定义所实施服务的 wsdl:service 元素的合格名称。该值存储为 QName

WSDL_PORT

指定 wsdl:port 元素的合格名称,用于定义用于访问该服务的端点。该值存储为 QName

WSDL_INTERFACE

指定定义所实施服务的 wsdl:portType 元素的合格名称。该值存储为 QName

WSDL_OPERATION

指定与消费者调用的操作对应的 wsdl:operation 元素的合格名称。该值存储为 QName

HTTP_RESPONSE_CODE

指定返回到消费者的响应代码。该值存储为一个 Integer 对象。

HTTP_REQUEST_HEADERS

指定请求上的 HTTP 标头。该值存储为 java.util.Map<String, List<String>>

HTTP_RESPONSE_HEADERS

指定响应的 HTTP 标头。该值存储为 java.util.Map<String, List<String>>

HTTP_REQUEST_METHOD

指定通过请求发送的 HTTP 动词。该值存储为 String

SERVLET_REQUEST

包含 servlet 的请求对象。该值存储为 javax.servlet.http.HttpServletRequest

SERVLET_RESPONSE

包含 servlet 的响应对象。该值存储为 javax.servlet.http.HttpResponse

SERVLET_CONTEXT

包含 servlet 的上下文对象。该值存储为 javax.servlet.ServletContext

PATH_INFO

指定正在请求的资源的路径。该值存储为 String

该路径是主机名后 URI 的部分,并在任何查询字符串之前。例如,如果端点的 URL 是 http://cxf.apache.org/demo/widgets,其路径为 /demo/widgets

QUERY_STRING

指定附加到用于调用请求的 URI 的查询(若有)。该值存储为 String

在 URI 的末尾,查询会出现在 URI 的末尾,。例如:如果向 http://cxf.apache.org/demo/widgets?color 发出了一个请求,查询字符串为 颜色

REFERENCE_PARAMETERS

指定 WS-Addressing 参考参数。这包括其 wsa:IsReferenceParameter 属性设置为 true 的所有 SOAP 标头。该值存储为 java.util.List

org.apache.cxf.transport.jms.JMSConstants

JMS_SERVER_HEADERS

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

[a] 使用 HTTP 此属性时,与标准 JAX-WS 定义的属性相同。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.