You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by Scott Nichol <sn...@scottnichol.com> on 2002/04/22 20:19:05 UTC

Fw: using SOAPContext as first argument in RPC SOAP messages class notworking

I quickly set up my notebook (downloaded soap 2.2 and tomcat 4.0.3) to run
the bytecode you sent.  My notebook is Windows 98 and JDK 1.3.1.  Your byte
code works fine for me.  The only thing I do that sounds different is that I
do not copy HellowWorldService.class to $CATALINA_HOME/common/classes.  I
copy it to $CATALINA_HOME/webapps/soap/WEB-INF/classes;
$CATALINA_HOME/webapps/soap is the directory into which I un-jar soap.war.
I'll give it a quick whirl using your method.

Scott

----- Original Message -----
From: "Andrew Trieger" <at...@yahoo.com>
To: <sn...@scottnichol.com>
Sent: Monday, April 22, 2002 13:15
Subject: Re: using SOAPContext as first argument in RPC SOAP messages class
notworking


> sure, i'm sending this just to you since the list probably doesnt want to
see bytecode...
> Drew
>
> Scott Nichol wrote:
>
>   Andrew,
>   Could you send me byte code for the service, i.e.
HelloWorldService.class?
>   If you can, I'll run it from my rig at home tonight to see how it works
for
>   me.
>
>   Scott
>
>   ----- Original Message -----
>   From: "Andrew Trieger" <at...@yahoo.com>
>   To: <so...@xml.apache.org>
>   Sent: Monday, April 22, 2002 12:48
>   Subject: Re: using SOAPContext as first argument in RPC SOAP messages
class
>   notworking
>
>   > Scott,
>   >     OK.  I now reproduced the error on my win2k (professional) box as
>   well.  To reiterate from the previous email response from me, I took
your
>   server class, put it in tomcat/classes and compiled it on my OSX box
(java
>   1.3.1_02, soap2.2, tomcat 4.0.1).
>   >     I deployed the service using the /soap/admin gui with the same
names,
>   parameters as is listed below.
>   >     I created the class for the client cut/paste from below (was
missing a
>   "("'s, but fixed that) into a separate directory on this same box,
compiled
>   it, ran it.
>   >
>   >     Got the same error.
>   >
>   >     Copied the tomcat server to my win2k box where java 1.3.1_02 JRE
from
>   javasoft already is installed.  ran tomcat without recompiles or
>   redeployments, started ok.
>   >
>   >     used the same client back on the OSX box to message the helloworld
>   service on the win2k box and got the same error.
>   >
>   >
>   >     ?????
>   >
>   > Drew
>   >
>   >
>   >
>   > Scott Nichol wrote:
>   >
>   >   Drew,
>   >   I thought that maybe if you had a bad definition for
HttpServletRequest
>   that the
>   >   JIT might throw an exception when it compiles the method.
>   >
>   >   Anyway, I wrote the following service and client and was able to
>   successfully
>   >   run it.  My environment is Win2k, JDK 1.3.1, SOAP 2.2, Tomcat 4.0.1.
If
>   you
>   >   cannot get it to run, I could send you my bytecode to test.
>   >
>   >   Scott
>   >
>   >   import javax.servlet.http.*;
>   >   public class HelloWorldService {
>   >    public String hello(org.apache.soap.rpc.SOAPContext ctx) {
>   >     HttpServletRequest req =
>   >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
>   TREQ
>   >   UEST);
>   >     return req != null ? req.getQueryString() : "null";
>   >    }
>   >   }
>   >
>   >   <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
>   >                id="urn:helloworld">
>   >     <isd:provider type="java"
>   >                   scope="Application"
>   >                   methods="hello">
>   >       <isd:java class="HelloWorldService"/>
>   >     </isd:provider>
>   >
>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListene
>   r>
>   >   </isd:service>
>   >
>   >   import java.net.*;
>   >   import java.util.*;
>   >   import org.apache.soap.*;
>   >   import org.apache.soap.rpc.*;
>   >
>   >   public class HelloWorldClient {
>   >    public static void main(String[] args) throws Exception {
>   >        if (args.length != 1
>   >            && (args.length != 2 || !args[0].startsWith ("-"))) {
>   >          System.err.println ("Usage: java " +
>   HelloWorldClient.class.getName () +
>   >                              " [-encodingStyleURI] SOAP-router-URL");
>   >          System.exit (1);
>   >        }
>   >
>   >        // Process the arguments.
>   >        int offset = 2 - args.length;
>   >        String encodingStyleURI = args.length == 2
>   >                                  ? args[0].substring(1)
>   >                                  : Constants.NS_URI_SOAP_ENC;
>   >        URL url = new URL (args[1 - offset]);
>   >
>   >        // Build the call.
>   >        Call call = new Call ();
>   >        call.setTargetObjectURI ("urn:helloworld");
>   >        call.setMethodName ("hello");
>   >        call.setEncodingStyleURI(encodingStyleURI);
>   >        Vector params = new Vector ();
>   >        Response resp = call.invoke url, "" );
>   >
>   >        // Check the response.
>   >        if (resp.generatedFault ()) {
>   >          Fault fault = resp.getFault ();
>   >          System.out.println ("Ouch, the call failed: ");
>   >          System.out.println ("  Fault Code   = " + fault.getFaultCode
());
>   >          System.out.println ("  Fault String = " +
fault.getFaultString
>   ());
>   >        } else {
>   >          Parameter result = resp.getReturnValue ();
>   >          System.out.println (result.getValue ());
>   >        }
>   >    }
>   >   }
>   >
>   >   ----- Original Message -----
>   >   From: "Andrew Trieger" <at...@yahoo.com>
>   >   To: <so...@xml.apache.org>
>   >   Sent: Friday, April 19, 2002 1:20 PM
>   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
messages
>   class not
>   >   working
>   >
>   >   > Good idea, but I *think* its not even executing my method as my
first
>   >   > line println isnt coming out, so I'm screwed, but i might be able
to
>   >   > subclass rpcrouter servlet, use mine instead of theirs, catch
>   throwable
>   >   > and dump any info to stderr...
>   >   >
>   >   > Any idea if defining my own custom fault-handler would be helpful?
>   I'm
>   >   > not sure how that would help, but possibly it would be called by
the
>   >   > local soap stuff and given more error message info than is
returned in
>   >   > the soap response?  eh...  long shot.
>   >   >
>   >   > I might just have to call this feature "Too new to work" and wait
6mos
>   >   > and get along without it.  I could define a different soap router
url
>   >   > for EVERY method and then control access in iplanet... hassle.
>   >   >
>   >   > Drew
>   >   >
>   >
>   > --
>   > ---
>   >
>   >
>
> --
> ---
>
>


----------------------------------------------------------------------------
----


> import javax.servlet.http.*;
>
> public class HelloWorldService {
>  public String hello(org.apache.soap.rpc.SOAPContext ctx) {
>   HttpServletRequest req =
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
TREQUEST);
>   return req != null ? req.getQueryString() : "null";
>  }
> }
>


Re: using SOAPContext as first argument in RPC SOAP messages class notworking

Posted by Scott Nichol <sn...@scottnichol.com>.
That is the problem.  When I put the byte code in
$CATALINA_HOME/common/classes, I get the same error you are seeing:

Ouch, the call failed:
  Fault Code   = SOAP-ENV:Server
  Fault String = Exception while handling service request:
org/apache/soap/rpc/SOAPContext

I bet that Tomcat uses a different class loader for code loaded from common,
one that does not have the various webapps directories among those to
search.

Scott

----- Original Message -----
From: "Scott Nichol" <sn...@scottnichol.com>
To: <so...@xml.apache.org>
Sent: Monday, April 22, 2002 14:19
Subject: Fw: using SOAPContext as first argument in RPC SOAP messages class
notworking


> I quickly set up my notebook (downloaded soap 2.2 and tomcat 4.0.3) to run
> the bytecode you sent.  My notebook is Windows 98 and JDK 1.3.1.  Your
byte
> code works fine for me.  The only thing I do that sounds different is that
I
> do not copy HellowWorldService.class to $CATALINA_HOME/common/classes.  I
> copy it to $CATALINA_HOME/webapps/soap/WEB-INF/classes;
> $CATALINA_HOME/webapps/soap is the directory into which I un-jar soap.war.
> I'll give it a quick whirl using your method.
>
> Scott
>
> ----- Original Message -----
> From: "Andrew Trieger" <at...@yahoo.com>
> To: <sn...@scottnichol.com>
> Sent: Monday, April 22, 2002 13:15
> Subject: Re: using SOAPContext as first argument in RPC SOAP messages
class
> notworking
>
>
> > sure, i'm sending this just to you since the list probably doesnt want
to
> see bytecode...
> > Drew
> >
> > Scott Nichol wrote:
> >
> >   Andrew,
> >   Could you send me byte code for the service, i.e.
> HelloWorldService.class?
> >   If you can, I'll run it from my rig at home tonight to see how it
works
> for
> >   me.
> >
> >   Scott
> >
> >   ----- Original Message -----
> >   From: "Andrew Trieger" <at...@yahoo.com>
> >   To: <so...@xml.apache.org>
> >   Sent: Monday, April 22, 2002 12:48
> >   Subject: Re: using SOAPContext as first argument in RPC SOAP messages
> class
> >   notworking
> >
> >   > Scott,
> >   >     OK.  I now reproduced the error on my win2k (professional) box
as
> >   well.  To reiterate from the previous email response from me, I took
> your
> >   server class, put it in tomcat/classes and compiled it on my OSX box
> (java
> >   1.3.1_02, soap2.2, tomcat 4.0.1).
> >   >     I deployed the service using the /soap/admin gui with the same
> names,
> >   parameters as is listed below.
> >   >     I created the class for the client cut/paste from below (was
> missing a
> >   "("'s, but fixed that) into a separate directory on this same box,
> compiled
> >   it, ran it.
> >   >
> >   >     Got the same error.
> >   >
> >   >     Copied the tomcat server to my win2k box where java 1.3.1_02 JRE
> from
> >   javasoft already is installed.  ran tomcat without recompiles or
> >   redeployments, started ok.
> >   >
> >   >     used the same client back on the OSX box to message the
helloworld
> >   service on the win2k box and got the same error.
> >   >
> >   >
> >   >     ?????
> >   >
> >   > Drew
> >   >
> >   >
> >   >
> >   > Scott Nichol wrote:
> >   >
> >   >   Drew,
> >   >   I thought that maybe if you had a bad definition for
> HttpServletRequest
> >   that the
> >   >   JIT might throw an exception when it compiles the method.
> >   >
> >   >   Anyway, I wrote the following service and client and was able to
> >   successfully
> >   >   run it.  My environment is Win2k, JDK 1.3.1, SOAP 2.2, Tomcat
4.0.1.
> If
> >   you
> >   >   cannot get it to run, I could send you my bytecode to test.
> >   >
> >   >   Scott
> >   >
> >   >   import javax.servlet.http.*;
> >   >   public class HelloWorldService {
> >   >    public String hello(org.apache.soap.rpc.SOAPContext ctx) {
> >   >     HttpServletRequest req =
> >   >
> >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
> >   TREQ
> >   >   UEST);
> >   >     return req != null ? req.getQueryString() : "null";
> >   >    }
> >   >   }
> >   >
> >   >   <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
> >   >                id="urn:helloworld">
> >   >     <isd:provider type="java"
> >   >                   scope="Application"
> >   >                   methods="hello">
> >   >       <isd:java class="HelloWorldService"/>
> >   >     </isd:provider>
> >   >
> >
>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListene
> >   r>
> >   >   </isd:service>
> >   >
> >   >   import java.net.*;
> >   >   import java.util.*;
> >   >   import org.apache.soap.*;
> >   >   import org.apache.soap.rpc.*;
> >   >
> >   >   public class HelloWorldClient {
> >   >    public static void main(String[] args) throws Exception {
> >   >        if (args.length != 1
> >   >            && (args.length != 2 || !args[0].startsWith ("-"))) {
> >   >          System.err.println ("Usage: java " +
> >   HelloWorldClient.class.getName () +
> >   >                              " [-encodingStyleURI]
SOAP-router-URL");
> >   >          System.exit (1);
> >   >        }
> >   >
> >   >        // Process the arguments.
> >   >        int offset = 2 - args.length;
> >   >        String encodingStyleURI = args.length == 2
> >   >                                  ? args[0].substring(1)
> >   >                                  : Constants.NS_URI_SOAP_ENC;
> >   >        URL url = new URL (args[1 - offset]);
> >   >
> >   >        // Build the call.
> >   >        Call call = new Call ();
> >   >        call.setTargetObjectURI ("urn:helloworld");
> >   >        call.setMethodName ("hello");
> >   >        call.setEncodingStyleURI(encodingStyleURI);
> >   >        Vector params = new Vector ();
> >   >        Response resp = call.invoke url, "" );
> >   >
> >   >        // Check the response.
> >   >        if (resp.generatedFault ()) {
> >   >          Fault fault = resp.getFault ();
> >   >          System.out.println ("Ouch, the call failed: ");
> >   >          System.out.println ("  Fault Code   = " +
fault.getFaultCode
> ());
> >   >          System.out.println ("  Fault String = " +
> fault.getFaultString
> >   ());
> >   >        } else {
> >   >          Parameter result = resp.getReturnValue ();
> >   >          System.out.println (result.getValue ());
> >   >        }
> >   >    }
> >   >   }
> >   >
> >   >   ----- Original Message -----
> >   >   From: "Andrew Trieger" <at...@yahoo.com>
> >   >   To: <so...@xml.apache.org>
> >   >   Sent: Friday, April 19, 2002 1:20 PM
> >   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
> messages
> >   class not
> >   >   working
> >   >
> >   >   > Good idea, but I *think* its not even executing my method as my
> first
> >   >   > line println isnt coming out, so I'm screwed, but i might be
able
> to
> >   >   > subclass rpcrouter servlet, use mine instead of theirs, catch
> >   throwable
> >   >   > and dump any info to stderr...
> >   >   >
> >   >   > Any idea if defining my own custom fault-handler would be
helpful?
> >   I'm
> >   >   > not sure how that would help, but possibly it would be called by
> the
> >   >   > local soap stuff and given more error message info than is
> returned in
> >   >   > the soap response?  eh...  long shot.
> >   >   >
> >   >   > I might just have to call this feature "Too new to work" and
wait
> 6mos
> >   >   > and get along without it.  I could define a different soap
router
> url
> >   >   > for EVERY method and then control access in iplanet... hassle.
> >   >   >
> >   >   > Drew
> >   >   >
> >   >
> >   > --
> >   > ---
> >   >
> >   >
> >
> > --
> > ---
> >
> >
>
>
> --------------------------------------------------------------------------
--
> ----
>
>
> > import javax.servlet.http.*;
> >
> > public class HelloWorldService {
> >  public String hello(org.apache.soap.rpc.SOAPContext ctx) {
> >   HttpServletRequest req =
> >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
> TREQUEST);
> >   return req != null ? req.getQueryString() : "null";
> >  }
> > }
> >
>
>


Re: using SOAPContext as first argument in RPC SOAP messages class notworking

Posted by Scott Nichol <sn...@scottnichol.com>.
That is the problem.  When I put the byte code in
$CATALINA_HOME/common/classes, I get the same error you are seeing:

Ouch, the call failed:
  Fault Code   = SOAP-ENV:Server
  Fault String = Exception while handling service request:
org/apache/soap/rpc/SOAPContext

I bet that Tomcat uses a different class loader for code loaded from common,
one that does not have the various webapps directories among those to
search.

Scott

----- Original Message -----
From: "Scott Nichol" <sn...@scottnichol.com>
To: <so...@xml.apache.org>
Sent: Monday, April 22, 2002 14:19
Subject: Fw: using SOAPContext as first argument in RPC SOAP messages class
notworking


> I quickly set up my notebook (downloaded soap 2.2 and tomcat 4.0.3) to run
> the bytecode you sent.  My notebook is Windows 98 and JDK 1.3.1.  Your
byte
> code works fine for me.  The only thing I do that sounds different is that
I
> do not copy HellowWorldService.class to $CATALINA_HOME/common/classes.  I
> copy it to $CATALINA_HOME/webapps/soap/WEB-INF/classes;
> $CATALINA_HOME/webapps/soap is the directory into which I un-jar soap.war.
> I'll give it a quick whirl using your method.
>
> Scott
>
> ----- Original Message -----
> From: "Andrew Trieger" <at...@yahoo.com>
> To: <sn...@scottnichol.com>
> Sent: Monday, April 22, 2002 13:15
> Subject: Re: using SOAPContext as first argument in RPC SOAP messages
class
> notworking
>
>
> > sure, i'm sending this just to you since the list probably doesnt want
to
> see bytecode...
> > Drew
> >
> > Scott Nichol wrote:
> >
> >   Andrew,
> >   Could you send me byte code for the service, i.e.
> HelloWorldService.class?
> >   If you can, I'll run it from my rig at home tonight to see how it
works
> for
> >   me.
> >
> >   Scott
> >
> >   ----- Original Message -----
> >   From: "Andrew Trieger" <at...@yahoo.com>
> >   To: <so...@xml.apache.org>
> >   Sent: Monday, April 22, 2002 12:48
> >   Subject: Re: using SOAPContext as first argument in RPC SOAP messages
> class
> >   notworking
> >
> >   > Scott,
> >   >     OK.  I now reproduced the error on my win2k (professional) box
as
> >   well.  To reiterate from the previous email response from me, I took
> your
> >   server class, put it in tomcat/classes and compiled it on my OSX box
> (java
> >   1.3.1_02, soap2.2, tomcat 4.0.1).
> >   >     I deployed the service using the /soap/admin gui with the same
> names,
> >   parameters as is listed below.
> >   >     I created the class for the client cut/paste from below (was
> missing a
> >   "("'s, but fixed that) into a separate directory on this same box,
> compiled
> >   it, ran it.
> >   >
> >   >     Got the same error.
> >   >
> >   >     Copied the tomcat server to my win2k box where java 1.3.1_02 JRE
> from
> >   javasoft already is installed.  ran tomcat without recompiles or
> >   redeployments, started ok.
> >   >
> >   >     used the same client back on the OSX box to message the
helloworld
> >   service on the win2k box and got the same error.
> >   >
> >   >
> >   >     ?????
> >   >
> >   > Drew
> >   >
> >   >
> >   >
> >   > Scott Nichol wrote:
> >   >
> >   >   Drew,
> >   >   I thought that maybe if you had a bad definition for
> HttpServletRequest
> >   that the
> >   >   JIT might throw an exception when it compiles the method.
> >   >
> >   >   Anyway, I wrote the following service and client and was able to
> >   successfully
> >   >   run it.  My environment is Win2k, JDK 1.3.1, SOAP 2.2, Tomcat
4.0.1.
> If
> >   you
> >   >   cannot get it to run, I could send you my bytecode to test.
> >   >
> >   >   Scott
> >   >
> >   >   import javax.servlet.http.*;
> >   >   public class HelloWorldService {
> >   >    public String hello(org.apache.soap.rpc.SOAPContext ctx) {
> >   >     HttpServletRequest req =
> >   >
> >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
> >   TREQ
> >   >   UEST);
> >   >     return req != null ? req.getQueryString() : "null";
> >   >    }
> >   >   }
> >   >
> >   >   <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
> >   >                id="urn:helloworld">
> >   >     <isd:provider type="java"
> >   >                   scope="Application"
> >   >                   methods="hello">
> >   >       <isd:java class="HelloWorldService"/>
> >   >     </isd:provider>
> >   >
> >
>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListene
> >   r>
> >   >   </isd:service>
> >   >
> >   >   import java.net.*;
> >   >   import java.util.*;
> >   >   import org.apache.soap.*;
> >   >   import org.apache.soap.rpc.*;
> >   >
> >   >   public class HelloWorldClient {
> >   >    public static void main(String[] args) throws Exception {
> >   >        if (args.length != 1
> >   >            && (args.length != 2 || !args[0].startsWith ("-"))) {
> >   >          System.err.println ("Usage: java " +
> >   HelloWorldClient.class.getName () +
> >   >                              " [-encodingStyleURI]
SOAP-router-URL");
> >   >          System.exit (1);
> >   >        }
> >   >
> >   >        // Process the arguments.
> >   >        int offset = 2 - args.length;
> >   >        String encodingStyleURI = args.length == 2
> >   >                                  ? args[0].substring(1)
> >   >                                  : Constants.NS_URI_SOAP_ENC;
> >   >        URL url = new URL (args[1 - offset]);
> >   >
> >   >        // Build the call.
> >   >        Call call = new Call ();
> >   >        call.setTargetObjectURI ("urn:helloworld");
> >   >        call.setMethodName ("hello");
> >   >        call.setEncodingStyleURI(encodingStyleURI);
> >   >        Vector params = new Vector ();
> >   >        Response resp = call.invoke url, "" );
> >   >
> >   >        // Check the response.
> >   >        if (resp.generatedFault ()) {
> >   >          Fault fault = resp.getFault ();
> >   >          System.out.println ("Ouch, the call failed: ");
> >   >          System.out.println ("  Fault Code   = " +
fault.getFaultCode
> ());
> >   >          System.out.println ("  Fault String = " +
> fault.getFaultString
> >   ());
> >   >        } else {
> >   >          Parameter result = resp.getReturnValue ();
> >   >          System.out.println (result.getValue ());
> >   >        }
> >   >    }
> >   >   }
> >   >
> >   >   ----- Original Message -----
> >   >   From: "Andrew Trieger" <at...@yahoo.com>
> >   >   To: <so...@xml.apache.org>
> >   >   Sent: Friday, April 19, 2002 1:20 PM
> >   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
> messages
> >   class not
> >   >   working
> >   >
> >   >   > Good idea, but I *think* its not even executing my method as my
> first
> >   >   > line println isnt coming out, so I'm screwed, but i might be
able
> to
> >   >   > subclass rpcrouter servlet, use mine instead of theirs, catch
> >   throwable
> >   >   > and dump any info to stderr...
> >   >   >
> >   >   > Any idea if defining my own custom fault-handler would be
helpful?
> >   I'm
> >   >   > not sure how that would help, but possibly it would be called by
> the
> >   >   > local soap stuff and given more error message info than is
> returned in
> >   >   > the soap response?  eh...  long shot.
> >   >   >
> >   >   > I might just have to call this feature "Too new to work" and
wait
> 6mos
> >   >   > and get along without it.  I could define a different soap
router
> url
> >   >   > for EVERY method and then control access in iplanet... hassle.
> >   >   >
> >   >   > Drew
> >   >   >
> >   >
> >   > --
> >   > ---
> >   >
> >   >
> >
> > --
> > ---
> >
> >
>
>
> --------------------------------------------------------------------------
--
> ----
>
>
> > import javax.servlet.http.*;
> >
> > public class HelloWorldService {
> >  public String hello(org.apache.soap.rpc.SOAPContext ctx) {
> >   HttpServletRequest req =
> >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
> TREQUEST);
> >   return req != null ? req.getQueryString() : "null";
> >  }
> > }
> >
>
>


Re: Fw: using SOAPContext as first argument in RPC SOAP messages class notworking

Posted by Scott Nichol <sn...@scottnichol.com>.
I'm not surprised iPlanet worked the same.  I believe the servlet spec is
now quite explicit about the different class loaders that must be used and
how they work.  I'm sure it was no great joy for the folks who had to
implement it.

Scott

----- Original Message -----
From: "Andrew Trieger" <at...@yahoo.com>
To: <so...@xml.apache.org>
Sent: Monday, April 22, 2002 14:10
Subject: Re: Fw: using SOAPContext as first argument in RPC SOAP messages
class notworking


> SON OF A BI#$@#$#@#$#@$@#
> That's it, i put my .class into the webapp's classes directory, and it
worked.
>
> Yes, I know tomcat uses like 4 different classloaders depending on where
the class file is, of course that doesnt explain why it also failed under
iplanet / soap, but it must simply be the case there that a different
classloader is used in iplanet for stuff in a general classes location and
classes within a webapp.
>
> Soap, when needing to do this separate search for a matching signature
with SOAPContext in it, must somehow be relying on it not simply being
available in the virtual machine, but loaded with the same classloader that
loaded the webapp???  Do you suppose this is a bug or are we supposed to
put, and only put, our services that we make available by soap into the
webapp's classes directory?  That seems a little dirty to me.
>
> whoa... thank you VERY much for all your help.  I hope this thread
provides some future help if others run into this tricky problem.
>
> Drew
>
>
>
> Scott Nichol wrote:
>
>   I quickly set up my notebook (downloaded soap 2.2 and tomcat 4.0.3) to
run
>   the bytecode you sent.  My notebook is Windows 98 and JDK 1.3.1.  Your
byte
>   code works fine for me.  The only thing I do that sounds different is
that I
>   do not copy HellowWorldService.class to $CATALINA_HOME/common/classes.
I
>   copy it to $CATALINA_HOME/webapps/soap/WEB-INF/classes;
>   $CATALINA_HOME/webapps/soap is the directory into which I un-jar
soap.war.
>   I'll give it a quick whirl using your method.
>   Scott
>
>   ----- Original Message -----
>   From: "Andrew Trieger" <at...@yahoo.com>
>   To: <sn...@scottnichol.com>
>   Sent: Monday, April 22, 2002 13:15
>   Subject: Re: using SOAPContext as first argument in RPC SOAP messages
class
>   notworking
>
>   > sure, i'm sending this just to you since the list probably doesnt want
to
>   see bytecode...
>   > Drew
>   >
>   > Scott Nichol wrote:
>   >
>   >   Andrew,
>   >   Could you send me byte code for the service, i.e.
>   HelloWorldService.class?
>   >   If you can, I'll run it from my rig at home tonight to see how it
works
>   for
>   >   me.
>   >
>   >   Scott
>   >
>   >   ----- Original Message -----
>   >   From: "Andrew Trieger" <at...@yahoo.com>
>   >   To: <so...@xml.apache.org>
>   >   Sent: Monday, April 22, 2002 12:48
>   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
messages
>   class
>   >   notworking
>   >
>   >   > Scott,
>   >   >     OK.  I now reproduced the error on my win2k (professional) box
as
>   >   well.  To reiterate from the previous email response from me, I took
>   your
>   >   server class, put it in tomcat/classes and compiled it on my OSX box
>   (java
>   >   1.3.1_02, soap2.2, tomcat 4.0.1).
>   >   >     I deployed the service using the /soap/admin gui with the same
>   names,
>   >   parameters as is listed below.
>   >   >     I created the class for the client cut/paste from below (was
>   missing a
>   >   "("'s, but fixed that) into a separate directory on this same box,
>   compiled
>   >   it, ran it.
>   >   >
>   >   >     Got the same error.
>   >   >
>   >   >     Copied the tomcat server to my win2k box where java 1.3.1_02
JRE
>   from
>   >   javasoft already is installed.  ran tomcat without recompiles or
>   >   redeployments, started ok.
>   >   >
>   >   >     used the same client back on the OSX box to message the
helloworld
>   >   service on the win2k box and got the same error.
>   >   >
>   >   >
>   >   >     ?????
>   >   >
>   >   > Drew
>   >   >
>   >   >
>   >   >
>   >   > Scott Nichol wrote:
>   >   >
>   >   >   Drew,
>   >   >   I thought that maybe if you had a bad definition for
>   HttpServletRequest
>   >   that the
>   >   >   JIT might throw an exception when it compiles the method.
>   >   >
>   >   >   Anyway, I wrote the following service and client and was able to
>   >   successfully
>   >   >   run it.  My environment is Win2k, JDK 1.3.1, SOAP 2.2, Tomcat
4.0.1.
>   If
>   >   you
>   >   >   cannot get it to run, I could send you my bytecode to test.
>   >   >
>   >   >   Scott
>   >   >
>   >   >   import javax.servlet.http.*;
>   >   >   public class HelloWorldService {
>   >   >    public String hello(org.apache.soap.rpc.SOAPContext ctx) {
>   >   >     HttpServletRequest req =
>   >   >
>   >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
>   >   TREQ
>   >   >   UEST);
>   >   >     return req != null ? req.getQueryString() : "null";
>   >   >    }
>   >   >   }
>   >   >
>   >   >   <isd:service
xmlns:isd="http://xml.apache.org/xml-soap/deployment"
>   >   >                id="urn:helloworld">
>   >   >     <isd:provider type="java"
>   >   >                   scope="Application"
>   >   >                   methods="hello">
>   >   >       <isd:java class="HelloWorldService"/>
>   >   >     </isd:provider>
>   >   >
>   >
>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListene
>   >   r>
>   >   >   </isd:service>
>   >   >
>   >   >   import java.net.*;
>   >   >   import java.util.*;
>   >   >   import org.apache.soap.*;
>   >   >   import org.apache.soap.rpc.*;
>   >   >
>   >   >   public class HelloWorldClient {
>   >   >    public static void main(String[] args) throws Exception {
>   >   >        if (args.length != 1
>   >   >            && (args.length != 2 || !args[0].startsWith ("-"))) {
>   >   >          System.err.println ("Usage: java " +
>   >   HelloWorldClient.class.getName () +
>   >   >                              " [-encodingStyleURI]
SOAP-router-URL");
>   >   >          System.exit (1);
>   >   >        }
>   >   >
>   >   >        // Process the arguments.
>   >   >        int offset = 2 - args.length;
>   >   >        String encodingStyleURI = args.length == 2
>   >   >                                  ? args[0].substring(1)
>   >   >                                  : Constants.NS_URI_SOAP_ENC;
>   >   >        URL url = new URL (args[1 - offset]);
>   >   >
>   >   >        // Build the call.
>   >   >        Call call = new Call ();
>   >   >        call.setTargetObjectURI ("urn:helloworld");
>   >   >        call.setMethodName ("hello");
>   >   >        call.setEncodingStyleURI(encodingStyleURI);
>   >   >        Vector params = new Vector ();
>   >   >        Response resp = call.invoke url, "" );
>   >   >
>   >   >        // Check the response.
>   >   >        if (resp.generatedFault ()) {
>   >   >          Fault fault = resp.getFault ();
>   >   >          System.out.println ("Ouch, the call failed: ");
>   >   >          System.out.println ("  Fault Code   = " +
fault.getFaultCode
>   ());
>   >   >          System.out.println ("  Fault String = " +
>   fault.getFaultString
>   >   ());
>   >   >        } else {
>   >   >          Parameter result = resp.getReturnValue ();
>   >   >          System.out.println (result.getValue ());
>   >   >        }
>   >   >    }
>   >   >   }
>   >   >
>   >   >   ----- Original Message -----
>   >   >   From: "Andrew Trieger" <at...@yahoo.com>
>   >   >   To: <so...@xml.apache.org>
>   >   >   Sent: Friday, April 19, 2002 1:20 PM
>   >   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
>   messages
>   >   class not
>   >   >   working
>   >   >
>   >   >   > Good idea, but I *think* its not even executing my method as
my
>   first
>   >   >   > line println isnt coming out, so I'm screwed, but i might be
able
>   to
>   >   >   > subclass rpcrouter servlet, use mine instead of theirs, catch
>   >   throwable
>   >   >   > and dump any info to stderr...
>   >   >   >
>   >   >   > Any idea if defining my own custom fault-handler would be
helpful?
>   >   I'm
>   >   >   > not sure how that would help, but possibly it would be called
by
>   the
>   >   >   > local soap stuff and given more error message info than is
>   returned in
>   >   >   > the soap response?  eh...  long shot.
>   >   >   >
>   >   >   > I might just have to call this feature "Too new to work" and
wait
>   6mos
>   >   >   > and get along without it.  I could define a different soap
router
>   url
>   >   >   > for EVERY method and then control access in iplanet... hassle.
>   >   >   >
>   >   >   > Drew
>   >   >   >
>   >   >
>   >   > --
>   >   > ---
>   >   >
>   >   >
>   >
>   > --
>   > ---
>   >
>   >
>
>   ------------------------------------------------------------------------
----
>   ----
>
>   > import javax.servlet.http.*;
>   >
>   > public class HelloWorldService {
>   >  public String hello(org.apache.soap.rpc.SOAPContext ctx) {
>   >   HttpServletRequest req =
>   >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
>   TREQUEST);
>   >   return req != null ? req.getQueryString() : "null";
>   >  }
>   > }
>   >
>
> --
> ---
>
>


Re: Fw: using SOAPContext as first argument in RPC SOAP messages class notworking

Posted by Scott Nichol <sn...@scottnichol.com>.
I'm not surprised iPlanet worked the same.  I believe the servlet spec is
now quite explicit about the different class loaders that must be used and
how they work.  I'm sure it was no great joy for the folks who had to
implement it.

Scott

----- Original Message -----
From: "Andrew Trieger" <at...@yahoo.com>
To: <so...@xml.apache.org>
Sent: Monday, April 22, 2002 14:10
Subject: Re: Fw: using SOAPContext as first argument in RPC SOAP messages
class notworking


> SON OF A BI#$@#$#@#$#@$@#
> That's it, i put my .class into the webapp's classes directory, and it
worked.
>
> Yes, I know tomcat uses like 4 different classloaders depending on where
the class file is, of course that doesnt explain why it also failed under
iplanet / soap, but it must simply be the case there that a different
classloader is used in iplanet for stuff in a general classes location and
classes within a webapp.
>
> Soap, when needing to do this separate search for a matching signature
with SOAPContext in it, must somehow be relying on it not simply being
available in the virtual machine, but loaded with the same classloader that
loaded the webapp???  Do you suppose this is a bug or are we supposed to
put, and only put, our services that we make available by soap into the
webapp's classes directory?  That seems a little dirty to me.
>
> whoa... thank you VERY much for all your help.  I hope this thread
provides some future help if others run into this tricky problem.
>
> Drew
>
>
>
> Scott Nichol wrote:
>
>   I quickly set up my notebook (downloaded soap 2.2 and tomcat 4.0.3) to
run
>   the bytecode you sent.  My notebook is Windows 98 and JDK 1.3.1.  Your
byte
>   code works fine for me.  The only thing I do that sounds different is
that I
>   do not copy HellowWorldService.class to $CATALINA_HOME/common/classes.
I
>   copy it to $CATALINA_HOME/webapps/soap/WEB-INF/classes;
>   $CATALINA_HOME/webapps/soap is the directory into which I un-jar
soap.war.
>   I'll give it a quick whirl using your method.
>   Scott
>
>   ----- Original Message -----
>   From: "Andrew Trieger" <at...@yahoo.com>
>   To: <sn...@scottnichol.com>
>   Sent: Monday, April 22, 2002 13:15
>   Subject: Re: using SOAPContext as first argument in RPC SOAP messages
class
>   notworking
>
>   > sure, i'm sending this just to you since the list probably doesnt want
to
>   see bytecode...
>   > Drew
>   >
>   > Scott Nichol wrote:
>   >
>   >   Andrew,
>   >   Could you send me byte code for the service, i.e.
>   HelloWorldService.class?
>   >   If you can, I'll run it from my rig at home tonight to see how it
works
>   for
>   >   me.
>   >
>   >   Scott
>   >
>   >   ----- Original Message -----
>   >   From: "Andrew Trieger" <at...@yahoo.com>
>   >   To: <so...@xml.apache.org>
>   >   Sent: Monday, April 22, 2002 12:48
>   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
messages
>   class
>   >   notworking
>   >
>   >   > Scott,
>   >   >     OK.  I now reproduced the error on my win2k (professional) box
as
>   >   well.  To reiterate from the previous email response from me, I took
>   your
>   >   server class, put it in tomcat/classes and compiled it on my OSX box
>   (java
>   >   1.3.1_02, soap2.2, tomcat 4.0.1).
>   >   >     I deployed the service using the /soap/admin gui with the same
>   names,
>   >   parameters as is listed below.
>   >   >     I created the class for the client cut/paste from below (was
>   missing a
>   >   "("'s, but fixed that) into a separate directory on this same box,
>   compiled
>   >   it, ran it.
>   >   >
>   >   >     Got the same error.
>   >   >
>   >   >     Copied the tomcat server to my win2k box where java 1.3.1_02
JRE
>   from
>   >   javasoft already is installed.  ran tomcat without recompiles or
>   >   redeployments, started ok.
>   >   >
>   >   >     used the same client back on the OSX box to message the
helloworld
>   >   service on the win2k box and got the same error.
>   >   >
>   >   >
>   >   >     ?????
>   >   >
>   >   > Drew
>   >   >
>   >   >
>   >   >
>   >   > Scott Nichol wrote:
>   >   >
>   >   >   Drew,
>   >   >   I thought that maybe if you had a bad definition for
>   HttpServletRequest
>   >   that the
>   >   >   JIT might throw an exception when it compiles the method.
>   >   >
>   >   >   Anyway, I wrote the following service and client and was able to
>   >   successfully
>   >   >   run it.  My environment is Win2k, JDK 1.3.1, SOAP 2.2, Tomcat
4.0.1.
>   If
>   >   you
>   >   >   cannot get it to run, I could send you my bytecode to test.
>   >   >
>   >   >   Scott
>   >   >
>   >   >   import javax.servlet.http.*;
>   >   >   public class HelloWorldService {
>   >   >    public String hello(org.apache.soap.rpc.SOAPContext ctx) {
>   >   >     HttpServletRequest req =
>   >   >
>   >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
>   >   TREQ
>   >   >   UEST);
>   >   >     return req != null ? req.getQueryString() : "null";
>   >   >    }
>   >   >   }
>   >   >
>   >   >   <isd:service
xmlns:isd="http://xml.apache.org/xml-soap/deployment"
>   >   >                id="urn:helloworld">
>   >   >     <isd:provider type="java"
>   >   >                   scope="Application"
>   >   >                   methods="hello">
>   >   >       <isd:java class="HelloWorldService"/>
>   >   >     </isd:provider>
>   >   >
>   >
>
<isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListene
>   >   r>
>   >   >   </isd:service>
>   >   >
>   >   >   import java.net.*;
>   >   >   import java.util.*;
>   >   >   import org.apache.soap.*;
>   >   >   import org.apache.soap.rpc.*;
>   >   >
>   >   >   public class HelloWorldClient {
>   >   >    public static void main(String[] args) throws Exception {
>   >   >        if (args.length != 1
>   >   >            && (args.length != 2 || !args[0].startsWith ("-"))) {
>   >   >          System.err.println ("Usage: java " +
>   >   HelloWorldClient.class.getName () +
>   >   >                              " [-encodingStyleURI]
SOAP-router-URL");
>   >   >          System.exit (1);
>   >   >        }
>   >   >
>   >   >        // Process the arguments.
>   >   >        int offset = 2 - args.length;
>   >   >        String encodingStyleURI = args.length == 2
>   >   >                                  ? args[0].substring(1)
>   >   >                                  : Constants.NS_URI_SOAP_ENC;
>   >   >        URL url = new URL (args[1 - offset]);
>   >   >
>   >   >        // Build the call.
>   >   >        Call call = new Call ();
>   >   >        call.setTargetObjectURI ("urn:helloworld");
>   >   >        call.setMethodName ("hello");
>   >   >        call.setEncodingStyleURI(encodingStyleURI);
>   >   >        Vector params = new Vector ();
>   >   >        Response resp = call.invoke url, "" );
>   >   >
>   >   >        // Check the response.
>   >   >        if (resp.generatedFault ()) {
>   >   >          Fault fault = resp.getFault ();
>   >   >          System.out.println ("Ouch, the call failed: ");
>   >   >          System.out.println ("  Fault Code   = " +
fault.getFaultCode
>   ());
>   >   >          System.out.println ("  Fault String = " +
>   fault.getFaultString
>   >   ());
>   >   >        } else {
>   >   >          Parameter result = resp.getReturnValue ();
>   >   >          System.out.println (result.getValue ());
>   >   >        }
>   >   >    }
>   >   >   }
>   >   >
>   >   >   ----- Original Message -----
>   >   >   From: "Andrew Trieger" <at...@yahoo.com>
>   >   >   To: <so...@xml.apache.org>
>   >   >   Sent: Friday, April 19, 2002 1:20 PM
>   >   >   Subject: Re: using SOAPContext as first argument in RPC SOAP
>   messages
>   >   class not
>   >   >   working
>   >   >
>   >   >   > Good idea, but I *think* its not even executing my method as
my
>   first
>   >   >   > line println isnt coming out, so I'm screwed, but i might be
able
>   to
>   >   >   > subclass rpcrouter servlet, use mine instead of theirs, catch
>   >   throwable
>   >   >   > and dump any info to stderr...
>   >   >   >
>   >   >   > Any idea if defining my own custom fault-handler would be
helpful?
>   >   I'm
>   >   >   > not sure how that would help, but possibly it would be called
by
>   the
>   >   >   > local soap stuff and given more error message info than is
>   returned in
>   >   >   > the soap response?  eh...  long shot.
>   >   >   >
>   >   >   > I might just have to call this feature "Too new to work" and
wait
>   6mos
>   >   >   > and get along without it.  I could define a different soap
router
>   url
>   >   >   > for EVERY method and then control access in iplanet... hassle.
>   >   >   >
>   >   >   > Drew
>   >   >   >
>   >   >
>   >   > --
>   >   > ---
>   >   >
>   >   >
>   >
>   > --
>   > ---
>   >
>   >
>
>   ------------------------------------------------------------------------
----
>   ----
>
>   > import javax.servlet.http.*;
>   >
>   > public class HelloWorldService {
>   >  public String hello(org.apache.soap.rpc.SOAPContext ctx) {
>   >   HttpServletRequest req =
>   >
>
(HttpServletRequest)ctx.getProperty(org.apache.soap.Constants.BAG_HTTPSERVLE
>   TREQUEST);
>   >   return req != null ? req.getQueryString() : "null";
>   >  }
>   > }
>   >
>
> --
> ---
>
>