Re: Adding SOAP header to response messages

Andreas Veithen <[email protected]>
Newsgroups gmane.text.xml.axis.user
Message-ID <CADx4_uUbce-DHH9cY=nnC9T4dPmFYOyO6cUAbpWi0kPqTRJAzQ@mail.gmail.com>
When Axis2 initializes the SOAPEnvelope for outgoing messages, it
already creates an empty SOAPHeader object. Therefore you should use
SOAPEnvelope#getHeader() instead of
SOAPFactory#createSOAPHeader(SOAPEnvelope).

Andreas

On Fri, Jan 18, 2013 at 10:03 AM, Pietro Romanazzi
<[email protected]> wrote:
> Hello guys
>
> I need to add a custom header to a response SOAP message.
> The simple handler I wrote is:
>
> import org.apache.axiom.om.OMNamespace;
> import org.apache.axiom.soap.SOAPEnvelope;
> import org.apache.axiom.soap.SOAPFactory;
> import org.apache.axiom.soap.SOAPHeader;
> import org.apache.axiom.soap.SOAPHeaderBlock;
> import org.apache.axis2.context.MessageContext;
> import org.apache.axis2.handlers.AbstractHandler;
>
> public class AddHeaderHandler extends AbstractHandler {
>     public AddHeaderHandler()  {
>     }
>     public InvocationResponse invoke(MessageContext ctx) {
>         SOAPEnvelope env = ctx.getEnvelope();
>         System.out.println("Soap Envelope before header injection:
> "+env.toString());
>         SOAPFactory factory = (SOAPFactory) env.getOMFactory();
>         OMNamespace ns = factory.createOMNamespace("http://my.org/axis2",
> "myns");
>         SOAPHeader head = factory.createSOAPHeader(env);
>         SOAPHeaderBlock header = head.addHeaderBlock("greetings", ns);
>         header.setText("byebye");
>         System.out.println("Soap Envelope after header
> injection"+env.toString());
>         return InvocationResponse.CONTINUE;
>     }
> }
>
>
> This is a fragment of axis2.xml
>
> <phaseOrder type="OutFlow">
>     <!--      user can add his own phases to this area  -->
>     <phase name="soapmonitorPhase"/>
>     <phase name="OperationOutPhase">
>     <handler name="greetings" class="AddHeaderHandler" />
>     </phase>
>     <!--system predefined phase-->
>     <!--these phase will run irrespective of the service-->
>     <phase name="RMPhase"/>
>     <phase name="PolicyDetermination"/>
>     <phase name="MessageOut">
>     </phase>
>     <phase name="Security"/>
> </phaseOrder>
>
> in response I see a soap fault
>
> <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>SOAPEnvelope
> must contain a body element which is either first or second child element of
> the SOAPEnvelope.</faultstring><detail
> /></soapenv:Fault></soapenv:Body></soapenv:Envelope>
>
> Debugging the code I see that the handler is started but, after the
> statement
> SOAPHeader head = factory.createSOAPHeader(env);
> If I watch the env variable I see
> com.sun.jdi.InvocationException occurred invoking method (the toString I
> suppose).
>
> It seems that the createSOAPHeader corrupts the env.
>
> I tried to put the handler in the “MessageOut” phase but the problem is the
> same.
> If I put the same handler in the “InFlow”, even if it doesn’t make any sense
> but just to try, it completes properly and the header is added prior the
> dispatching phase but obviously the response doesn’t contain the header.
>
> Help, suggestions?
>
> Thanks
>
> Pietro
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.