Most likely, you need to move your interceptor down in the chain a little, at 
least beyond the SoapOutInterceptor.   The SoapOutInterceptor would be 
responsible for setting up and creating the SOAP:Envelope and Body and such, 
but with your interceptor running before it, the call to sm.getSOAPHeader() 
already creates those and they kind of blow up trying to add additional nodes.

Dan


On Wednesday 05 May 2010 7:59:24 am Glen Mazza wrote:
> Hello, using CXF 2.2.7, I'm trying to use SAAJ and a client-side
> interceptor to add two elements to the header of a SOAP request.  I've
> already successfully done the same with a JAX-WS handler[1] and would like
> to do the same with the interceptor--although I know there are non-SAAJ
> ways of doing this[2].
> 
> The client-side error message I'm getting is:
> [INFO] WARNING: Interceptor for
> {http://www.example.org/contract/DoubleIt}DoubleItService#{http://www.examp
> le.org/contract/DoubleIt}DoubleIt has thrown exception, unwinding now
> [INFO] org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made
> to insert a node where it is not permitted.
> [INFO]        at
> com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl.insertBefore(CoreDo
> cumentImpl.java:391) [INFO]   at
> com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(NodeImpl.java:2
> 35) [INFO]    at
> com.sun.xml.messaging.saaj.soap.SOAPPartImpl.appendChild(SOAPPartImpl.java:
> 502) [INFO]   at
> org.apache.cxf.staxutils.W3CDOMStreamWriter.setChild(W3CDOMStreamWriter.jav
> a:114) [INFO]         at
> org.apache.cxf.staxutils.W3CDOMStreamWriter.newChild(W3CDOMStreamWriter.jav
> a:104) [INFO]         at
> org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamW
> riter.java:132) [INFO]        at
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelop
> eStart(SoapOutInterceptor.java:122) [INFO]    at
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(So
> apOutInterceptor.java:81) [INFO]      at
> org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(So
> apOutInterceptor.java:61) [INFO]      at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChai
> n.java:243)
> 
> No logging is happening service-side within Tomcat, indicating that the
> service is not being called due to this client-side interceptor exception.
> 
> Within my Client code, I have the following:
> 
>         DoubleItPortType port = service.getDoubleItPort();
> 
>         Client client = ClientProxy.getClient(port);
>         client.getOutInterceptors().add(
>                 new SAAJOutInterceptor());
>         client.getOutInterceptors().add(
>                 new ClientInterceptors.AddSOAPHeaderOutInterceptor());
>         ...
> 
> Within my client-side interceptor, I have the following code (note that it
> is almost entirely commented-out):
> 
> public class ClientInterceptors {
> 
>     /*...other interceptors...*/
> 
>     public static class AddSOAPHeaderOutInterceptor extends
> AbstractSoapInterceptor {
> 
>         public AddSOAPHeaderOutInterceptor() {
>             super(Phase.PRE_PROTOCOL);
>         }
> 
>         @Override
>         public void handleMessage(SoapMessage message) throws Fault {
>             SOAPMessage sm = message.getContent(SOAPMessage.class);
> 
>             try {
>                 SOAPFactory sf = SOAPFactory.newInstance();
>                 SOAPHeader sh = sm.getSOAPHeader();
>                 /*
>                 if (sh == null) {
>                     sh = sm.getSOAPPart().getEnvelope().addHeader();
>                 }
> 
>                 Name twoTermName = sf.createName("TwoTerms", "samp",
> "http://www.example.org";);
>                 SOAPHeaderElement shElement = sh
>                         .addHeaderElement(twoTermName);
>                 SOAPElement firstTerm = shElement.addChildElement("term");
>                 firstTerm.addTextNode("Apple");
>                 shElement.addChildElement(firstTerm);
>                 SOAPElement secondTerm = shElement.addChildElement("term");
>                 secondTerm.addTextNode("Orange");
>                 shElement.addChildElement(secondTerm); */
>             } catch (SOAPException e) {
>                 throw new Fault(e);
>             }
>         }
>     }
> }
> 
> It is the single-line "SOAPHeader sh = sm.getSOAPHeader();" that causes
> this bug to occur, if I comment it out the interceptor happily runs
> through (of course, doesn't do anything because the rest of the code is
> commented out.)
> 
> Any idea what I might be doing wrong?
> 
> Thanks,
> Glen
> 
> [1] http://www.jroller.com/gmazza/entry/jaxws_handler_tutorial#hand3
> [2]
> http://old.nabble.com/Adding-SOAPHeader-using-an-Interceptor-td25818665.htm
> l#a25818665

-- 
Daniel Kulp
dk...@apache.org
http://dankulp.com/blog

Reply via email to