Hey Dhaval
Thanks for looking into the issue. Let me try to give some comments inline.
On Wed, Jul 9, 2008 at 5:34 PM, Dhaval Chauhan
<[EMAIL PROTECTED]> wrote:
> Hi,
>
> I was working on the scenarios for the JSON-RPC mentioned on the SCA
> Java Web 2.0 Road map. I tried the first scenario i.e. 'Empty catalog
> throws a Business Exception. Business Exception should properly
> propagate and display nicely to client'
>
> I tried simulating the exception condition by making the .get() method
> of the FruitsCatalogImpl.java throw the business exception.
>
> First I noticed that the JSON representation of the exception is not
> being recognized by the browser js engine.
> Currently, the Tuscany runtime is producing something like :
>
> "{\"id\":3,\"error\":services.ClientException: Fruits Catalog empty}"
>
> Instead, I think it should be :
> "{\"id\":3,\"error\":{\"trace\":\"services.ClientException: Fruits
> Catalog empty\",\"code\":490,\"msg\":\"Fruits catalog empty\"}}"
>
> Is it some issue related with the binding where the actual JSON error
> message is formatted ?
This is because we are handling errors as regular responses in
JSONRPCServiceServlet. So, instead of just using the JSONResponse to
return errors, we should use a JSONRPCResult, that would know how to
properly marshal the exception in JSON format.
I did a quick change in the servlet (handleJSONRPCMethodInvocation),
and the following code allows me to get the proper exception in the
client side.
JSONRPCResult errorResult = new
JSONRPCResult(JSONRPCResult.CODE_REMOTE_EXCEPTION, id, e.getCause() );
return errorResult.toString().getBytes("UTF-8");
>
>
> After fixing this issue, I was still having issues with the exception
> not being caught by the try/catch block, and I had to modify the
> store.html client code as follow :
>
> function init() {
> var item = new Array();
> try
> {
> item = catalog.get();
> }
> catch(e)
> {
> alert(e.message);
> return;
> }
> catalog_getResponse(item);
> shoppingCart.get("", shoppingCart_getResponse);
> }
>
As for the client code, how about the following pattern for the
callback function :
function shoppingTotal_getTotalResponse(total, exception) {
if(exception) {alert(exception.message);}
document.getElementById('total').innerHTML = total;
}
and the service call would continue with the same pattern we have been
using, but would need to be surrounded by try/catch
try {
shoppingTotal.getTotal(shoppingTotal_getTotalResponse);
//shoppingTotal_getTotalResponse(total);
} catch (e) {
alert(e);
}
Let me create a JIRA for this issue, and you could provide a clean
patch with all necessary changes if you are interested.
>
> Thanks,
> Dhaval
> ________________________________
> The i'm Talkaton. Can 30-days of conversation change the world? Find out
> now.
--
Luciano Resende
Apache Tuscany Committer
http://people.apache.org/~lresende
http://lresende.blogspot.com/