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
>

Reply via email to