42.2. 在服务实施中使用上下文
概述
使用 WebServiceContext 接口将上下文信息提供给服务实现。您可以从 WebServiceContext 对象获取 MessageContext
对象,该对象使用应用范围内当前请求的上下文属性填充。您可以操作 属性的值,并通过响应链传播它们。
MessageContext 接口继承自 java.util.Map 接口。它的内容可以使用 Map 接口的方法进行操作。
获取上下文
要在服务实现中获取消息上下文,请执行以下操作:
例 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 ()
方法
v
get
Object
key
此 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 ()
方法
v
put
K
key
V
value
ClassCastExceptionIllegalArgumentExceptionNullPointerException
如果在消息上下文中已存在设置的属性,则 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 “服务实施上下文中提供的属性” 列出通过服务实施对象中上下文访问的属性。
属性名称 | 描述 |
---|---|
| |
PROTOCOL_HEADERS[a] |
指定特定于传输的标头信息。该值存储为 |
RESPONSE_CODE |
指定返回到消费者的响应代码。该值存储为一个 |
ENDPOINT_ADDRESS |
指定服务提供商的地址。该值存储为 |
HTTP_REQUEST_METHOD |
指定通过请求发送的 HTTP 动词。该值存储为 |
PATH_INFO |
指定正在请求的资源的路径。该值存储为
该路径是主机名后 URI 的部分,并在任何查询字符串之前。例如,如果端点的 URI 是 http://cxf.apache.org/demo/widgets,则路径为 |
QUERY_STRING |
指定附加到用于调用请求的 URI 的查询(若有)。该值存储为
在 URI 的末尾,查询会出现在 URI 的末尾, |
MTOM_ENABLED |
指定服务提供商是否可以将 MTOM 用于 SOAP 附加。该值存储为 |
SCHEMA_VALIDATION_ENABLED |
指定服务提供商是否针对 schema 验证信息。该值存储为 |
FAULT_STACKTRACE_ENABLED |
指定运行时是否提供堆栈追踪以及错误消息。该值存储为 |
CONTENT_TYPE |
指定消息的 MIME 类型。该值存储为 |
BASE_PATH |
指定正在请求的资源的路径。该值存储为
该路径是主机名后 URI 的部分,并在任何查询字符串之前。例如,如果端点的 URL 是 http://cxf.apache.org/demo/widgets,基本路径为 |
编码 |
指定消息的编码。该值存储为 |
FIXED_PARAMETER_ORDER |
指定参数是否必须以特定顺序显示在消息中。该值存储为 |
MAINTAIN_SESSION |
指定消费者是否希望为将来的请求维护当前会话。该值存储为 |
WSDL_DESCRIPTION |
指定定义所实施服务的 WSDL 文档。该值存储为 |
WSDL_SERVICE |
指定定义所实施服务的 |
WSDL_PORT |
指定 |
WSDL_INTERFACE |
指定定义所实施服务的 |
WSDL_OPERATION |
指定与消费者调用的操作对应的 |
| |
MESSAGE_OUTBOUND_PROPERTY |
指定消息是否出站。该值存储为 |
INBOUND_MESSAGE_ATTACHMENTS |
包含请求消息中包含的任何附件。该值存储为 映射的键值是标头的 MIME Content-ID。 |
OUTBOUND_MESSAGE_ATTACHMENTS |
包含响应消息的任何附件。该值存储为 映射的键值是标头的 MIME Content-ID。 |
WSDL_DESCRIPTION |
指定定义所实施服务的 WSDL 文档。该值存储为 |
WSDL_SERVICE |
指定定义所实施服务的 |
WSDL_PORT |
指定 |
WSDL_INTERFACE |
指定定义所实施服务的 |
WSDL_OPERATION |
指定与消费者调用的操作对应的 |
HTTP_RESPONSE_CODE |
指定返回到消费者的响应代码。该值存储为一个 |
HTTP_REQUEST_HEADERS |
指定请求上的 HTTP 标头。该值存储为 |
HTTP_RESPONSE_HEADERS |
指定响应的 HTTP 标头。该值存储为 |
HTTP_REQUEST_METHOD |
指定通过请求发送的 HTTP 动词。该值存储为 |
SERVLET_REQUEST |
包含 servlet 的请求对象。该值存储为 |
SERVLET_RESPONSE |
包含 servlet 的响应对象。该值存储为 |
SERVLET_CONTEXT |
包含 servlet 的上下文对象。该值存储为 |
PATH_INFO |
指定正在请求的资源的路径。该值存储为
该路径是主机名后 URI 的部分,并在任何查询字符串之前。例如,如果端点的 URL 是 http://cxf.apache.org/demo/widgets,其路径为 |
QUERY_STRING |
指定附加到用于调用请求的 URI 的查询(若有)。该值存储为
在 URI 的末尾,查询会出现在 URI 的末尾, |
REFERENCE_PARAMETERS |
指定 WS-Addressing 参考参数。这包括其 |
| |
JMS_SERVER_HEADERS | 包含 JMS 消息标头。如需更多信息,请参阅 第 42.4 节 “使用 JMS 消息属性”。 |
[a]
使用 HTTP 此属性时,与标准 JAX-WS 定义的属性相同。
|