2

I will be extremely grateful if someone share his experience in solving the following problem. I have a SOAP service in the JDK implementation (which is Metro, I believe).

For the logging purpose we need to extract the body of both the incoming request and generated response. I try to fetch it by implementing a SOAPHandler on the server side. I configure handler as a Spring bean. All the examples I found essentially replicate the example from the Oracle documentation: https://docs.oracle.com/cd/E23943_01/web.1111/e13734/handlers.htm#WSADV170:

      public boolean handleMessage(SOAPMessageContext messageContext)
  {
     Boolean outboundProperty = (Boolean)
         messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);

     if (outboundProperty.booleanValue()) {
         System.out.println("\nOutbound message:");
     } else {
         System.out.println("\nInbound message:");
     }

     System.out.println("** Response: "+messageContext.getMessage().toString());
    return true;
  }

Here one reads one of the Boolean properties of the SOAP message context which, as I see it, corresponds to either request or response.

But debugger in my experiments never enters the branch corresponding to response (else-branch). How is such handler supposed to trace both request and response?

I also wonder what message is read as messageContext.getMessage(): is it incoming (request) or outbound (response)

I wonder now is it possible indeed by implementing handleMessage() method to get access to both request and response? Does a single handler intercepts both request and its response? Did I misunderstand the example?

And ... SOAPHandler - is it a specific instance for every request (request-response pair)? Thank you

1 Answers1

2

Try this for SoapHandler:

Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
 if (isRequest) {
//handle request
 } else {
//handle response
         }

And this for LogicalHandler:

 Boolean outboundProperty = (Boolean)
         messageContext.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY);
     if (outboundProperty.booleanValue()) {
            System.out.println("\nOutbound message:");
     } else {
            System.out.println("\nInbound message:");
     }
ACV
  • 9,964
  • 5
  • 76
  • 81