Have you looked at org.apache.cxf.binding.soap.SoapMessage? There a number of interceptors under org.apache.cxf.binding.soap.interceptor that demonstrate how to read Soap headers.
-----Original Message----- From: Michael Täschner [mailto:[email protected]] Sent: Monday, May 16, 2011 6:27 AM To: [email protected] Subject: Re: Analyse Soap Header via Interceptor Hi CXF-Users, can anybody help me figuring out how to read my client set SOAP header on server side via an interceptor or give me an idea if my approach is incorrect ? Thanks and Regards, Michael Am 13. Mai 2011 12:08 schrieb Michael Täschner <[email protected]>: > Hi again, > > can anyone give me a hint how to access the SOAP Header (complexType > "messageHeader") from the request via an interceptor ? > > Thanks and Regards, > Michael > > Am 10. Mai 2011 17:17 schrieb Michael Täschner <[email protected] > >: > > Hi, >> >> I have been trying to handle SOAP headers outside of functional >> operations, meaning I do not use @WebParam to separate business concern from >> context and/or authorization information. The header type is added to the >> SEI via @XmlSeeAlso and using the jaxb binding I can set the header on the >> client side (verified by looking at tcpmon requests/responses) >> >> Client: >> CalculatorService service = new CalculatorService(endpoint); >> >> final Header header = new Header(new QName("messageHeader"), >> messageHeader, new JAXBDataBinding(MessageHeader.class)); >> final List<Header> headers = new ArrayList<Header>(); >> headers.add(header); >> >> Calculator calculator = service.getCalculatorPort(); >> >> ((BindingProvider)calculator).getRequestContext().put(Header.HEADER_LIST, >> headers); >> >> >> On the server side the CXF server is created manually using >> JaxWsServerFactoryBean and I register my interceptor implementation >> ReadSOAPHeaderInInterceptor. Unfortunately, whatever approach I chose, I can >> retrieve the "messageHeader" element from the message but the properties are >> always null (values). Could somebody give me a hint of what I am missing ? >> >> CXF Server creation: >> >> final JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean(); >> svrFactory.setServiceClass(serviceInterface); >> svrFactory.setAddress(contextPath); >> svrFactory.setServiceBean(endpoint); >> >> // create the server and save the reference >> final Server server = svrFactory.create(); >> >> // add our soap header interceptor >> server.getEndpoint().getInInterceptors().add(new SAAJInInterceptor()); >> server.getEndpoint().getInInterceptors().add(new >> ReadSOAPHeaderInInterceptor()); >> >> Interceptor impl: >> public class ReadSOAPHeaderInInterceptor extends AbstractSoapInterceptor { >> private final static Logger log = >> LoggerFactory.getLogger(ReadSOAPHeaderInInterceptor.class); >> private QName messageHeader = new QName("messageHeader"); >> private SAAJInInterceptor saajIn = new SAAJInInterceptor(); >> >> public ReadSOAPHeaderInInterceptor() { >> super(Phase.USER_PROTOCOL); >> addAfter(ReadHeadersInterceptor.class.getName()); >> addAfter(SAAJInInterceptor.class.getName()); >> } >> >> @Override >> public void handleMessage(final SoapMessage message) throws Fault { >> log.info("handleMessage started"); >> >> Header header = message.getHeader(messageHeader); >> >> if (null == header) { >> throw new SoapFault("SOAP Header MessageHeader is missing", >> new QName("missingMessageHeader")); >> } >> log.info("header object: " + header.getObject()); >> >> SOAPMessage doc = message.getContent(SOAPMessage.class); >> if (doc == null) { >> log.debug("SOAPMessage not set, handle with own saaj >> interceptor"); >> saajIn.handleMessage(message); >> doc = message.getContent(SOAPMessage.class); >> } >> SOAPHeader headers = null; >> try { >> headers = doc.getSOAPHeader(); >> } catch (SOAPException e) { >> e.printStackTrace(); >> } >> >> for (Iterator<SOAPElement> nodeIter = headers.getChildElements(); >> nodeIter.hasNext();) { >> SOAPElement node = nodeIter.next(); >> log.info(String.format("node %s with value %s", >> node.getNodeName(), node.getNodeValue())); >> if ("messageHeader".equals(node.getNodeName())) { >> log.info("found messageHeader node"); >> MessageHeader messageHeader = new MessageHeader(); >> for (int i = 0 ; i < node.getChildNodes().getLength(); >> i++) { >> SOAPElement property = >> (SOAPElement)node.getChildNodes().item(i); >> log.info("property: "+property.getNodeName()); >> >> if("session".equals(property.getNodeName())) { >> messageHeader.setSession(property.getNodeValue()); >> } else if ("clientIP".equals(property.getNodeName())) >> { >> >> messageHeader.setClientIP(property.getNodeValue()); >> } else if ("clientID".equals(property.getNodeName())) >> { >> >> messageHeader.setClientID(property.getNodeValue()); >> } else if ("requestID".equals(property.getNodeName())) >> { >> try { >> >> messageHeader.setRequestID(Integer.parseInt(property.getNodeValue())); >> } catch (NumberFormatException nfe) { >> log.warn("requestId is not valid: >> "+property.getNodeValue()); >> messageHeader.setRequestID(0); >> } >> } >> } >> >> RequestContext.getInstance().setMessageHeader(messageHeader); >> break; >> } >> } >> } >> } >> >> Thanks and Regards, >> Michael >> > >
