2 Replies Latest reply on Mar 5, 2006 8:42 AM by thomas.diesler

    SOAPHandler Question

      I'm currently using JBoss 4.0.3SP1 with W24EE as my SOAP Stack. We re-did our webservices structure and implementation here to use W24EE as oppose to our older and more proprietary approach. Unfortunately, we still need to handle the old message formats for some period. My thought for solving this problem was to use SOAPHandlers to intercept the request and response and re-format if it's the old message type. So, to test out how this works, I created an extension of GenericHandler and configured it in my webservices.xml. I tested the initial implementation to make sure that it was at least being called and it was. Next, I added a little more test logic to the handleRequest method to get the incoming parameter (a Long) and change it's value. The method looks like this:

      public boolean handleRequest(MessageContext ctx) {
       System.out.println("In handle request-------------");
       org.jboss.axis.MessageContext axisCtx = (org.jboss.axis.MessageContext)ctx;
       Message m = axisCtx.getCurrentMessage();
       try {
       SOAPElementAxisImpl envelope = m.getSOAPEnvelope();
       Document doc = envelope.getAsDocument();
       Element env = (Element)doc.getChildNodes().item(0);
       Node body = env.getChildNodes().item(3);
       Node methodName = body.getChildNodes().item(1);
       Node param1 = methodName.getChildNodes().item(1);
       Node valNode = param1.getFirstChild();
       System.out.println("Value: " + valNode.getNodeValue());
       valNode.setNodeValue("18541413");
       System.out.println("New Value: " + valNode.getNodeValue());
       }
       catch (AxisFault e) {
       e.printStackTrace();
       }
       return true;
       }


      But after testing this logic, I could see that the parameter value was not being changed when the call made it to my Java Service Endpoint. Am I doing something wrong here? What can I do to ensure that the changes to the incoming SOAP XML actually take effect?

        • 1. Re: SOAPHandler Question

          I actually took a different route her to get to a viable solution. Instead of using a SOAPHandler, I used a Servlet Filter. The Filter gets to the data before the JAX-RPC Runtime code does, so you don't have to worry about properly resetting data in the MessageContext or the RPCInvocation objects which is risky.

          • 2. Re: SOAPHandler Question
            thomas.diesler

            The SOAP message needs to conform to the abstract contract defined in wsdl. If that is the case, either JAXRPC implementation will do.