IBM BPM, V8.0.1, All platforms > Authoring services in Integration Designer > Services and service-related functions > Create a service for Cognos reports in Integration Designer > Work with Cognos reports
JAX-RPC handler for a SOAP header
When using the Java API for XML-based RPC (JAX-RPC) a JAX-RPC handler is needed to serialize and deserialize SOAP header information.
Create a JAX-RPC handler
Use the following Java code to create a JAX-RPC handler for working with the SOAP header.
The final method, cleanHeader, also should be added to the end of your business process (see Retrieving a Cognos report to see how it is invoked).
package com.ibm.wbit.cognos; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.rpc.handler.Handler; import javax.xml.rpc.handler.HandlerInfo; import javax.xml.rpc.handler.MessageContext; import javax.xml.rpc.handler.soap.SOAPMessageContext; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPHeaderElement; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; public class CognosRPCHandler implements Handler { private static ThreadLocal<SOAPHeader> soapHeader = new ThreadLocal<SOAPHeader>(); @Override public void destroy() { // TODO Auto-generated method stub System.out.println("@@@@@ CognosRPCHandler: In destroy. Current thread: " + Thread.currentThread().getId() + " Handler instance: " + this.hashCode()); } @Override public QName[] getHeaders() { // TODO Auto-generated method stub System.out.println("@@@@@ CognosRPCHandler: In getHeaders"); return null; } @Override public boolean handleFault(MessageContext arg0) { // TODO Auto-generated method stub System.out.println("@@@@@ CognosRPCHandler: In handleFault"); return true; } @Override public boolean handleRequest(MessageContext arg0) { // TODO Auto-generated method stub System.out.println("@@@@@ CognosRPCHandler: In handleRequest. Current thread: " + Thread.currentThread().getId() + " Handler instance: " + this.hashCode()); SOAPMessageContext context = (SOAPMessageContext)arg0; try { SOAPMessage message = context.getMessage(); SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); if (soapEnvelope.getHeader() == null) { soapEnvelope.addHeader(); } // set the soap header SOAPHeader latestSOAPHeader = soapHeader.get(); if (latestSOAPHeader != null) { Iterator iterator = latestSOAPHeader.getChildElements(); while(iterator.hasNext()) { SOAPHeaderElement soapHeaderElement = (SOAPHeaderElement)iterator.next(); soapEnvelope.getHeader().addChildElement(soapHeaderElement); } } } catch (Exception e) { e.printStackTrace(); } return true; } @Override public boolean handleResponse(MessageContext arg0) { // TODO Auto-generated method stub System.out.println("@@@@@ CognosRPCHandler: In handleResponse. Current thread: " + Thread.currentThread().getId() + " Handler instance: " + this.hashCode()); SOAPMessageContext context = (SOAPMessageContext)arg0; try { SOAPMessage message = context.getMessage(); SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); soapHeader.set(soapEnvelope.getHeader()); // clear the default soap header. soapEnvelope.getHeader().detachNode(); } catch (Exception e) { e.printStackTrace(); } return true; } @Override public void init(HandlerInfo arg0) { // TODO Auto-generated method stub System.out.println("@@@@@ CognosRPCHandler: In init. Current thread: " + Thread.currentThread().getId() + " Handler instance: " + this.hashCode()); } public static void cleanHeader() { soapHeader.set(null); } }
Setting a JAX-RPC handler
To set the JAX-RPC handler for a service, use the deployment editor.
- Right-click the module in the Business Integration view and select Open deployment editor.
- When the deployment editor opens, check the handler is included in the configuration.