You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@ws.apache.org by Oliver Cole <ol...@onesteprevolution.com> on 2005/08/02 20:21:31 UTC
Re: Removing exception names from the returned fault
Adam,
Thank you very much... that has helped tremendously!
Oli
On Sun, 2005-07-31 at 18:08, Adam Taft wrote:
> Oliver,
>
> I was frustrated with this issue too. I had to work this out for
> myself, but finally figured out how to get it right. It's kindof
> confusing, and there's not a lot of documention available.
>
> In essence, you need to:
>
> 1) Extend XmlRpcException and override the toString() method.
> 2) Throw this extended XmlRpcException in your server code.
>
> I'm attaching some test code to demonstrate why you need to do the above.
>
> The problem essentially comes from how the XmlRpcServer must wrap any
> thrown exceptions in an XmlRpcException. To do this, it calls the
> toString() method of the thrown Exception and stores this as the message
> field in the newly created XmlRpcException. This is mistake number one
> (it should call the exception's getMessage() method instead). Then, the
> XmlRpcServer must convert the XmlRpcException to a string for sending on
> the wire. Again, it calls the toString() method of XmlRpcException
> instead of getMessage(). This is mistake number two.
>
> So anyway, if you do the two steps above on your server, you should get
> the results you're looking for. Hope this helps.
>
> Adam
>
> p.s. I'm using xmlrpc-1.2-b1.jar
>
>
> Oliver Cole wrote:
> >
> > Yes, but I am talking about the fault string that is actually sent over
> > the wire, in the XMLRPC/HTTP response. I throw an exception in my server
> > side code, and it ends up with that name in the text of the fault that
> > gets returned to the client.
> >
> > Now, I could be receiving that fault in a Perl RPC client, or in Java
> > code or whatever, the fact remains: the name of the exception class is
> > in the *text* of the fault.
> >
> > On the client side in Java, this of course generates an XmlRpcException,
> > but my issue is what gets sent to the client, from my server code, in
> > the first place.
> >
> > Can anyone help?
> >
> > Oli
> >
>
> ______________________________________________________________________
> import java.util.Vector;
>
> import org.apache.xmlrpc.WebServer;
> import org.apache.xmlrpc.XmlRpcClient;
> import org.apache.xmlrpc.XmlRpcException;
>
>
> public class Test {
>
> public static void main(String[] args) {
>
> WebServer server = new WebServer(8080);
> server.addHandler("test", new Test());
> server.start();
>
>
> // Test #1
> try {
> XmlRpcClient client = new XmlRpcClient("http://localhost:8080");
> client.execute("test.throwException", new Vector());
> } catch (Exception e) {
> System.err.println(e.getMessage());
> }
>
>
> // Test #2
> try {
> XmlRpcClient client = new XmlRpcClient("http://localhost:8080");
> client.execute("test.throwXmlRpcException", new Vector());
> } catch (Exception e) {
> System.err.println(e.getMessage());
> }
>
>
> // Test #3
> try {
> XmlRpcClient client = new XmlRpcClient("http://localhost:8080");
> client.execute("test.throwMyOwnXmlRpcException", new Vector());
> } catch (Exception e) {
> System.err.println(e.getMessage());
> }
>
>
> server.shutdown();
>
> }
>
>
> public boolean throwException() throws Exception {
> if (true) {
> throw new Exception("throwException() called. This is a normal Exception.");
> }
> return true;
> }
>
> public boolean throwXmlRpcException() throws Exception {
> if (true) {
> throw new XmlRpcException(1, "throwXmlRpcException() called. This is an unmodified XmlRpcException.");
> }
> return true;
> }
>
> public boolean throwMyOwnXmlRpcException() throws Exception {
> if (true) {
> throw new MyOwnXmlRpcException (2, "throwMyOwnXmlRpcException() called. This is an extended XmlRpcException with the overridden toString() method.");
> }
> return true;
> }
>
> }
>
> class MyOwnXmlRpcException extends XmlRpcException {
>
> protected MyOwnXmlRpcException(int code, String message) {
> super(code, message);
> }
>
> public String toString() {
> return super.getMessage();
> }
>
> }