For one project I was working on, I needed to get access to the SOAP headers of web service call. I am using the Apache CXF services stack. There were quite a few threads on how to get access to SOAP headers from an interceptor. In my case, I needed the contents of the header inside the implementation.
wsdl2java does have the ability to create a java service class that provides access to the headers using the -exsh option. This was not an option for me since even with this flag on, the headers were not added to the service calls. I think it was how the WSDL I had was designed. This meant that I needed to do the work of pulling out the headers myself.
The SOAP headers can be retrieved from the JAX-WS SOAPMessageContext the easiest. Getting access to this was not trivial. I added the resource annotation to get access to the WebServiceContext. Unfortunately the MessageContext this gave me was not a SOAPMessageContext and provided no way to access the SOAP headers.
After looking through the code for the SoapMessage CXF class, I found how it gets the headers out of the Message. I came up with the following to access the headers from my implementation class:
@Resource
private WebServiceContext context;
private List<Header> getHeaders() {
MessageContext messageContext = context.getMessageContext();
if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) {
return null;
}
Message message = ((WrappedMessageContext) messageContext).getWrappedMessage();
List<Header> headers = CastUtils.cast((List<?>) message.get(Header.HEADER_LIST));
return headers;
}
This provides all of the headers available. To get the specific one I needed using JAXB I added the following to my code:
List<Header> headers = getHeaders();
if (headers != null) {
for (Header h: headers) {
Object o = h.getObject();
// Unwrap the node using JAXB
if (o instanceof Node) {
o = getJaxb().createUnmarshaller().unmarshal((Node) o);
}
if (o instanceof DesiredHeaderType) {
// Do whatever is required with the header object instance
}
}
}
This way of accessing the headers turns out to be much simpler than writing an interceptor and trying to stuff the results of that into the request.
Comments