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 >
