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();
> 	}
> 	
> }