使用 JAX-WS 发送传输头
您可以启用现有的 Java™ API for XML-Based Web Services (JAX-WS) Web Service 客户机以使用传输头来发送应用程序定义的信息以及 Web Service 请求。此外,您可以启用 JAX-WS Web Service 端点以使用传输头来发送应用程序定义的信息以及 Web Service 响应消息。
开始之前
您需要 JAX-WS Web Service 客户机,您可以启用该客户机以发送传输头。
发送传输头在 JAX-WS Web Service 客户机中受支持,并且也受 HTTP 和 JMS 传输的支持。Web Service 客户机必须直接调用 JAX-WS API,而不是通过任意层(例如,网关功能)进行调用。
关于此任务
使用 JAX-WS 编程模型时,客户机必须在 BindingProvider 的 RequestContext 对象上设置一个属性以使用 Web Service 请求消息在传输头中发送值。设置属性后,将在针对 BindingProvider 对象的后续远程方法调用的所有请求中设置值,直到关联的属性设置为 null 或废弃 BindingProvider 对象为止。
要在来自 JAX-WS Web Service 客户机的出站请求上的传输头中发送值,请按如下所示来修改客户机代码:
过程
结果
您具有已配置成在 Web Service 请求消息中发送传输头的 JAX-WS Web Service 客户机。
示例
public class MyApplicationClass {
// Inject an instance of the service's port-type.
@WebServiceRef(EchoService.class)
private EchoPortType port;
// This method will invoke the web service operation and send transport headers on the request.
public void invokeService() {
// Set up the Map that will contain the request headers.
Map<String, Object> requestHeaders = new HashMap<String, Object>();
requestHeaders.put(“MyHeader1”, “This is a string value”);
requestHeaders.put(“MyHeader2”, new Integer(33));
requestHeaders.put(“MyHeader3”, new Boolean(true));
// Set the Map as a property on the RequestContext.
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(com.ibm.websphere.webservices.Constants.REQUEST_TRANSPORT_PROPERTIES, requestHeaders);
// Invoke the web services operation.
String result = port.echoString(“Hello, world!”);
}
}
从 JAX-WS 端点发送响应传输头
开始之前
从 JAX-WS 端点发送响应传输头与从 JAX-WS 客户机发送请求传输头类似。它受 HTTP 和 JMS 传输的支持。
关于此任务
过程
- 创建包含传输头的 java.util.Map 对象。
- 对于您要在响应消息中发送的每一个传输头,请向 Map 对象添加一个条目(键和值)。 这类似于客户机的前一过程。
- 检索与端点的调用相关联的 MessageContext(javax.xml.ws.handler.MessageContext 的实例)。
- 使用 com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES 属性在 MessageContext 上设置 Map 对象。
结果
示例
@WebService
public class EchoServiceImpl implements EchoServicePortType {
// Inject an instance of WebServiceContext so we can retrieve
// the MessageContext for each invocation of this endpoint.
@Resource
WebServiceContext ctxt;
/**
* Default constructor.
*/
public EchoServiceImpl() {
....
}
public String echoString(String input) {
String result = “Echo result: “ + input;
// Retrieve the MessageContext from the injected WebServiceContext.
MessageContext mc = ctxt.getMessageContext();
// Send some headers back in the response message.
Map<String, Object> responseHeaders = new HashMap<String, Object>();
responseHeaders.put("MyHeader1", "This is a string response value");
responseHeaders.put("MyHeader2", new Integer(33));
responseHeaders.put("MyHeader3”, new Boolean(false));
// Set the response header Map on the MessageContext.
mc.put(com.ibm.websphere.webservices.Constants.RESPONSE_TRANSPORT_PROPERTIES, responseHeaders);
return result;
}
}