使用 JAX-WS 发送隐式 SOAP 头

可以使现有的 Java™ API for XML-Based Web Services (JAX-WS) Web Service 客户机在隐式 SOAP 头中发送值。通过修改客户机代码来发送隐式 SOAP 头,可以在出局 web service 请求中发送特定信息。

开始之前

要完成本任务,需要可以用来发送隐式 SOAP 头的 Web service 客户机。

隐式 SOAP 头是符合下列其中一种描述的 SOAP 头:
  • 在 Web 服务描述语言 (WSDL) 文件的绑定中声明为 SOAP 头的消息部件,但消息定义未由 WSDL 文件中的 portType 元素引用。
  • 未包含在 WSDL 文件中的元素。

处理程序和服务端点可以通过使用带附件的 SOAP API for Java (SAAJ) 数据模型来处理隐式或显式 SOAP 头。

使用 JAX-WS 时,对于可以操作的头类型没有限制。

关于此任务

客户机应用程序对 Dispatch 或 Proxy 对象设置属性以发送和接收隐式 SOAP 头。

过程

  1. 创建 java.util.HashMap<QName, List<String>> 对象。
  2. 对于客户机要发送的每个隐式 SOAP 头,将条目添加到 HashMap 对象。 HashMap 条目键是 SOAP 头的 QName。HashMap 条目值是 List<String> 对象,而每个字符串是整个 SOAP 头元素的 XML 文本。通过使用 List<String> 对象,可以添加具有相同 QName 对象的多个 SOAP 头元素。
  3. 将 HashMap 对象设置为 Dispatch 或 Proxy 对象请求上下文上的属性。 属性名为 com.ibm.wsspi.websvcs.Constants.JAXWS_OUTBOUND_SOAP_HEADERS。 该属性的值为 HashMap。
  4. 使用 Dispatch 或 Proxy 对象发出远程方法调用。 HashMap 对象中的头通过出局消息进行发送。
    如果符合以下任何条件,将发生 WebServiceException 错误:
    • HashMap 对象包含不是 QName 对象的密钥,或如果 HashMap 对象包含不是 List<String> 对象的值。
    • 表示 SOAP 头的字符串不是符合条件的 XML 消息。
    • HashMap 包含表示 SOAP 头的键且该 SOAP 头声明为受自有组件保护。

结果

具有已配置为发送隐式 SOAP 头的 JAX-WS Web Service 客户机。

示例

以下编程示例说明如何在 JAX-WS Web Service 请求和响应上下文中设置两个请求 SOAP 头和接收一个响应 SOAP 头:
1  //Create the hashmaps for the outbound soap headers
2  Map<QName, List<String>> outboundHeaders=new HashMap<QName, List<String>>(); 
3 4  //Add "AtmUuid1" and "AtmUuid2" to the outbound map
5  List<String> list1 = new ArrayList<String>();
6  list1.add("<AtmUuid1 xmlns=\"com.rotbank.security\"><uuid>ROTB-0A01254385FCA09</uuid></AtmUuid1>");
7  List<String> list2 = new ArrayList<String>();
8  list2.add("<AtmUuid2 xmlns=\"com.rotbank.security\"><uuid>ROTB-0A01254385FCA09</uuid></AtmUuid2>"
9  outboundHeaders.put(new QName("com.rotbank.security", "AtmUuid1"), list1);
10 outboundHeaders.put(new QName("com.rotbank.security", "AtmUuid2"), list2);
11 // Set the outbound map on the request context
12 dispatch.getRequestContext().put("jaxws.binding.soap.headers.outbound");
13 // Invoke the remote operation
14 dispatch.invoke(parm1);
15 // Get the inbound header map from the response context
16 Map<QName,List<String>> inboundMap = dispatch.getResponseContext().get("jaxws.binding.soap.headers.outbound");
17 List<String> serverUuidList = inboundMap.get(new QName("com.rotbank.security","ServerUuid"));
18 String text = serverUiidList.get(0);
19 //Note: text now equals a XML object that contains a SOAP header:
21//"<y:ServerUuid xmlns:y=\"com.rotbank.security\"><:uuid>ROTB-0A03519322FSA01
22  </y:uuid></y:ServerUuid.");

在第 2 行上,创建出站 SOAP 头映射。

在第 5 行到第 10 行上,将 AtmUuid1 和 AtmUuid2 头元素添加到出站映射。

在第 12 行上,对请求上下文设置出站映射,这会导致在调用操作时将 AtmUuid1 和 AtmUuid2 头添加到请求消息。

在第 14 行上,调用远程操作。

在第 15 行上,获取出站头映射。

在第 17 行到第 18 行上,从响应映射中检索 ServerUuid 头。此映射会访问响应消息中的 SOAP 头。


指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_reqsoapheadjaxws
文件名:twbs_reqsoapheadjaxws.html