I'm really not sure how the object would be null. That is very strange.
DataBinding being null is normal. If there isn't a header processor
registered, the Object would be an org.w3c.dom.Element and the databinding
would be null.
Could you try something like:
System.out.println(StaxUtils.toString((Element)header.getObject()));
Dan
On Tuesday, May 17, 2011 7:01:47 AM Michael Täschner wrote:
> Hi Daniel,
>
> I followed Svens and your suggestion and removed the SAAJ stuff. My
> ReadSOAPHeaderInInterceptor now looks as follows:
>
> public class ReadSOAPHeaderInInterceptor extends AbstractSoapInterceptor {
> private final static Logger log =
> LoggerFactory.getLogger(ReadSOAPHeaderInInterceptor.class);
> // private QName messageHeader = new QName("messageHeader");
>
> public ReadSOAPHeaderInInterceptor() {
> super(Phase.POST_LOGICAL);
> addAfter(ReadHeadersInterceptor.class.getName());
> }
>
> @Override
> public void handleMessage(final SoapMessage message) throws Fault {
> log.info("handleMessage started");
>
>
> for (Header header :message.getHeaders()) {
> log.info("name: "+header.getName().toString());
> log.info("binding: "+header.getDataBinding());
> log.info("object: "+header.getObject());
> }
>
> log.info("handleMessage done");
> }
> }
>
> The "messageHeader" header is found yet binding and object are always null.
> Additionally I found your suggestion from another soap header related mail
> where you point to registering a HeaderProcessor - I would use that
> approach but don't know how to implement the InterceptorProvider
> getInterceptorProvider(); method in this case. Can you give me some more
> help with this ? Do I need to register more interceptors than the
> ReadHeadersInterceptor ??
>
> Not right now... My quick 30 second tutorial would be:
> > In your setup code, you would need to *register* an instance of
> > HeaderProcessor with the HeaderManager extension found on the Bus:
> > bus.getExtension(HeaderManager.class).*registerHeaderProcessor*(processor
> > );
> >
> >
> > Your header processor would hold an instance of JAXBDataBinding
> > configured with the classes your namespace will processes.
> >
> > Thus, when the ReadHeadersInterceptor encounters headers in your
> > namespace, it will grab the *DataBinding* and deserialize it to the
> > correct object. That said, it deserializes the entire header element.
> > You would need a JAXB class for the qo:header type which has a "foo"
> > field of the foo type.
>
> Thanks and Kind Regards,
> Michael
>
> Am 16. Mai 2011 21:12 schrieb Daniel Kulp <[email protected]>:
> > On Monday, May 16, 2011 9:26:36 AM Michael Täschner wrote:
> > > 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 ?
> >
> > As Sven mentioned, if your interceptor is a <SoapMessage> kind, the
> > SoapMessage passed to it would have a getHeaders call that is preferred
> > over
> > using the SAAJ stuff as the SAAJ stuff would break the streaming.
> >
> > The issue with your code MAY be:
> > if ("messageHeader".equals(node.getNodeName())) {
> >
> > Since CXF uses the Namespace aware parsers, you may need:
> > if ("messageHeader".equals(((Element)node).getLocalName())) {
> >
> > or similar ad getNodeName may be returning the fully qualified name.
> >
> > Dan
> >
> > > 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
> >
> > --
> > Daniel Kulp
> > [email protected]
> > http://dankulp.com/blog
> > Talend - http://www.talend.com
--
Daniel Kulp
[email protected]
http://dankulp.com/blog
Talend - http://www.talend.com