The JAXWS implementation within IBM WebSphere 7 and 8 appears to have some problems when it comes to soap handlers and large MTOM attachments. It appears that the entire mes
Here is how to access the headers without reading the entire message using the WebSphere built-in JAX-WS implementation.
public boolean handleMessage(SOAPMessageContext context) {
AttributedURI messageIdURI = (AttributedURI)context.get("com.ibm.wsspi.wsaddressing.inbound.MessageID");
String messageId = "";
if (messageIdURI != null && messageIdURI.getURI() != null) {
messageId = messageIdURI.getURI().toString();
}
EndpointReference fromApplicationEPR = (EndpointReference)context.get("com.ibm.wsspi.wsaddressing.inbound.FromEPR");
String fromApplication = "";
if (fromApplicationEPR != null && fromApplicationEPR.getAddress() != null &&
fromApplicationEPR.getAddress().getURI() != null) {
fromApplication = fromApplicationEPR.getAddress().getURI().toString();
}
...
return true;
}
Note that this differs based on the precise JAX-WS implementation. I'll post how to do this via Apache CXF when I get a chance. Here are the needed imports for the above code:
import com.ibm.ws.wsaddressing.AttributedURI;
import com.ibm.ws.wsaddressing.EndpointReference;
For Apache CXF, the best approach is to use an Interceptor which is CXF implementation specific. Below is an example custom interceptor class.
package com.company.app.interceptor;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;
public class SOAPHeaderInterceptor extends AbstractSoapInterceptor {
private static Logger logger = Logger.getLogger(SOAPHeaderInterceptor.class);
public SOAPHeaderInterceptor() {
super(Phase.USER_PROTOCOL);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
try {
Header fromHeader = message.getHeader(new QName("http://www.w3.org/2005/08/addressing", "From"));
Header messageIdHeader = message.getHeader(new QName("http://www.w3.org/2005/08/addressing", "MessageID"));
String from = null;
if (fromHeader != null && fromHeader.getObject() != null) {
from = ((Element)fromHeader.getObject()).getTextContent();
}
String messageId = null;
if (messageIdHeader != null && messageIdHeader.getObject() != null) {
messageId = ((Element)messageIdHeader.getObject()).getTextContent();
}
} catch (Exception e) {
logger.error("Unable to read SOAP Headers", e);
}
}
}
Then, in your JAX-WS service implementation class specify the @InInterceptors annotation.
@InInterceptors(interceptors ="com.company.app.interceptor.SOAPHeaderInterceptor")