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
> >
> >
> >  
> >
> 
> 

Reply via email to