So i played more with this and here's what i found
out:
- In the handler, the changes to the message, envelope
and body will all get saved and passed to the Service
afterwards
- Any chnages to the nodes inside the body are allowed
to be made and displayed while in the handler but
beyond that none of those changes make it!
** some where in the handler **
public void invoke(MessageContext context) {
...
Node someNode =
body.getElementsByTagName("MyNodeName").item(0);
someNode.appendChild(
body.getOwnerDocument().createTextNode("someTextForMyNode"));
// print the body now
// the oputput will include the new text node
System.out.println(XMLUtils.ElementToString(body));
// out of desperation you can do the following
// which should not be needed
// but they won't help you with the new Node
// being added to the body and hence being passed
// to your Service down the chain
envelope.removeBody();
envelope.setBody(body);
Message newMessage = new Message(envelope);
messageContext.setRequestMessage(newMessage);
}
** some time later inside the Service **
public Element[] service(Element[] elements) {
for (int i = 0; i < elements.length; i++) {
// print the elements to your hearts content
// you will not see any traces of the textnode
// you added in your handler
// all you see is the original elements
System.out.println(
XMLUtils.ElementToString(elements[i]));
}
return elements;
}
jeff
--- Jeff Saremi <[EMAIL PROTECTED]> wrote:
> I should have explained more about what i'm doing. I
> don't know where this processRequest() method is. It
> looks like there are two or more Handler concepts
> within Axis. The Handler that i'm talking about are
> the ones you specify in the "requestFlow" or
> "responseFlow" chains:
>
> <service name="MyService" style="message">
> <parameter name="className" value="MyService" />
> <parameter name="allowedMethods" value="service"
> />
> <requestFlow>
> <handler type="java:MyHandler"/>
> </requestFlow>
> </service>
>
> Here's the method that MyHandler overrides. The code
> below is just to point out the problem -- this is
> not
> how i'm planning on writing my final code:
>
> public class WARPHandler extends BasicHandler {
> public void invoke(MessageContext context) throws
> AxisFault {
> try {
> Message message = context.getRequestMessage();
> SOAPEnvelope envelope = message.getSOAPEnvelope();
> SOAPBody body = envelope.getBody();
> // do some modification to the elements in the
> body
> // ...
> System.out.println(
> "Is Body referenced? " +
> (body == context.getMessage().getSOAPBody()));
> MyService.bodyElementInHandler =
> body.getFirstChild();
> } catch (Exception e) {
> e.printStackTrace();
> AxisFault.makeFault(e);
> }
> }
> }
>
> And the Service gets the Body document or elements
> or
> the SOAPEnvelope after the Handler is done with it:
>
> public class MyService {
> public static Object bodyElementInHandler;
> public Document service(Document bodyElement) {
> // the bodyElement here has none of the changes
> // that were made to it in the Handler!
> System.out.println(
> "bodies are not the same: " +
> (bodyElementInHandler == bodyElement));
> return bodyElement;
> }
> }
>
> In the invoke() method of the Handler i tried to
> show
> that the Body that I got is not a copy of what is in
> the Message and ultimately in the MessageContext. It
> is just a refernce to it. Therefore modifications to
> this Body or its subelements need not be set again
> in
> the Message. However, regardless of it being a copy
> or
> a reference I also set the CurrentMessage of
> MessageContext to a new Message (i have not shown
> this
> part of the code here).
> Then I set a static variable in my Service just for
> the sake of comparison.
> In the service() method of MyService I compare the
> passed document to the reference set by the Handler.
> These two objects, even though they display the same
> XML structure are not the same. the body that was
> passed to the service() method is the old version of
> the body in the SOAPEnvelope. And this is what
> frustrates me beyond reason.
>
> I'd appreciate if someone could explain why this is
> happenning.
> thanks
>
>
>
> --- Jeff Greif <[EMAIL PROTECTED]> wrote:
> > This pattern (for one of the jax-rpc handler
> > methods) guarantees that no
> > matter what copying takes place, your changes will
> > register. If your
> > handler decides to do nothing with the message,
> > return null from
> > whatever you implement for processRequest. In
> > general it seems that
> > items retrieved from MessageContext objects are
> > copies, and must be set
> > back into the context after modification. This
> > applies to properties
> > and perhaps other things as well.
> >
> > public boolean handleRequest(MessageContext
> > context) {
> >
> > SOAPMessageContext soapContext =
> > (SOAPMessageContext) context;
> > SOAPMessage message =
> > soapContext.getMessage();
> > SOAPMessage result =
> > processRequest(message);
> > if (result != null) {
> > soapContext.setMessage(result);
> > }
> > return true;
> > }
> >
> > Jeff
> >
> >
> > Jeff Saremi wrote:
> >
> > >Either there is something i'm not getting or my
> > whole
> > >code/configuration is wrong.
> > >
> > >I'd like to intercept a request using a handler,
> > >change something in that request and then let my
> > >service deal with these changes. However, I
> cannot
> > >this simple, intuitive concept to work! I have
> > spent
> > >over two full days playing with different objects
> > and
> > >different template methods in my service (a
> message
> > >service) all to no avail.
> > >
> > >What i'd like to do is get the XML for the body
> of
> > the
> > >incoming request in my handler, change some
> values
> > in
> > >it, and then let my message service deal with the
> > >modified body. But after extensive testing I
> > realized
> > >that the Body that is passed to my Service and
> the
> > one
> > >i modified in my Handler are completely
> different!
> > >It's as if Axis makes a copy of the incoming
> > request,
> > >before its modified by my Handler and passes that
> > old
> > >copy to my Service.
> > >
> > >Is this true? If not please let me know and i
> will
> > >send you some more code and configuration for you
> > guys
> > >to examine.
> > >
> > >thanks,
> > >jeff
> > >
> > >
> > >
> > >
> >
> >
>