>
> Does anyone have a reason for why I should not report this a bug in the
> issue tracker ?

Its a feature, not a defect.

You have to *explicitly* declare any methods you want to send to the client.
Without this declaration, GWT would have had to create javascript code for
every RuntimeException in the system - and that would certainly lead to code
bloat.

--Sri


On 16 September 2010 11:26, Kasper Hansen <[email protected]> wrote:

> After closer examination, this solution is not good enough. Examine the
> stacktrace below;
>
> SEVERE: [1284616090213000] javax.servlet.ServletContext log: Exception
> while dispatching incoming RPC call
>
> com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public
> abstract void
> com.netgazelle.client.service.AccountService.createAccount(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.util.Date,java.lang.String,java.lang.String,java.lang.String,java.lang.String)
> throws com.netgazelle.shared.CreateException' threw an unexpected exception:
> com.netgazelle.shared.DuplicatePhoneCreationException
>
> at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(
> RPC.java:378)
>
> at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:581
> )
>
> at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(
> RemoteServiceServlet.java:188)
>
> at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(
> RemoteServiceServlet.java:224)
>
> at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(
> AbstractRemoteServiceServlet.java:62)
>
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
>
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
>
> at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
>
> at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(
> ServletHandler.java:1166)
>
> at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(
> ServeBlobFilter.java:58)
>
> at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(
> ServletHandler.java:1157)
>
> at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(
> TransactionCleanupFilter.java:43)
>
> at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(
> ServletHandler.java:1157)
>
> at com.google.appengine.tools.development.StaticFileFilter.doFilter(
> StaticFileFilter.java:122)
>
> at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(
> ServletHandler.java:1157)
>
> at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388
> )
>
> at org.mortbay.jetty.security.SecurityHandler.handle(
> SecurityHandler.java:216)
>
> at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182
> )
>
> at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765
> )
>
> at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
>
> at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(
> DevAppEngineWebAppContext.java:70)
>
> at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152
> )
>
> at
> com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(
> JettyContainerService.java:349)
>
> at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152
> )
>
> at org.mortbay.jetty.Server.handle(Server.java:326)
>
> at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
>
> at org.mortbay.jetty.HttpConnection$RequestHandler.content(
> HttpConnection.java:938)
>
> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
>
> at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
>
> at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
>
> at org.mortbay.io.nio.SelectChannelEndPoint.run(
> SelectChannelEndPoint.java:409)
>
> at org.mortbay.thread.QueuedThreadPool$PoolThread.run(
> QueuedThreadPool.java:582)
>
> Caused by: com.netgazelle.shared.DuplicatePhoneCreationException
>
> at com.netgazelle.server.manager.AccountManager.createAccount(
> AccountManager.java:285)
>
> at com.netgazelle.server.service.AccountServiceImpl.createAccount(
> AccountServiceImpl.java:74)
>
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>
> at sun.reflect.NativeMethodAccessorImpl.invoke(
> NativeMethodAccessorImpl.java:39)
>
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:25)
>
> at java.lang.reflect.Method.invoke(Method.java:597)
>
> at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(
> Runtime.java:100)
>
> at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:562
> )
>
> ... 30 more
>
> My problem lies in RPC.java line
> 377; !RPCServletUtils.isExpectedException(serviceMethod, cause))
>
> The function RPCServletUtils.isExpectedException does not take this into
> consideration;
>
> --> if the cause is an unchecked exception
> --> if the cuase is an subclass instance of an defined and checked
> exception
>
> The workaround seems to be to define the explicit exceptions throws in the
> service interface.
>
> Does anyone have a reason for why I should not report this a bug in the
> issue tracker ?
>
> Thanks,
>
> :-) Kasper
>
> On Tue, Sep 14, 2010 at 8:50 AM, San0 <[email protected]> wrote:
> > Your service probably extends RemoteServiceServlet, which is catching
> > all non declared exceptions. Simple solution is to create your own
> > RemoteServiceServlet implementation with overridden:
> > String processCall(String payload) throws SerializationException
> > Something like this:
> >
> > try {
> >      RPCRequest rpcRequest = RPC.decodeRequest(payload,
> > delegate.getClass(), this);
> >      onAfterRequestDeserialized(rpcRequest);
> >      return RPC.invokeAndEncodeResponse(delegate,
> > rpcRequest.getMethod(),
> >          rpcRequest.getParameters(),
> > rpcRequest.getSerializationPolicy(),
> >          rpcRequest.getFlags());
> >    } catch (IncompatibleRemoteServiceException ex) {
> >      log("An IncompatibleRemoteServiceException was thrown while
> > processing this call.",ex);
> >      return RPC.encodeResponseForFailure(null, ex);
> >    } catch (Exception ex) {
> >      // RuntimeException
> >      return RPC.encodeResponseForFailure(null, new
> > GwtClientException(ex.getCause().getMessage()));
> >    }
> >
> > try-catch is from GWT sources, 2nd catch is what u need to re-throw
> > exceptions to client.
> >
> > On Sep 13, 9:24 pm, Kasper Hansen <[email protected]> wrote:
> >> Hi,
> >>
> >> I have this;
> >>
> >> public abstract class CreateException extends RuntimeException
> implements
> >> Serializable {
> >>
> >> }
> >>
> >> Notice that I extend from RuntimeException, making it an unchecked
> >> exception.
> >>
> >> Then I have these two;
> >>
> >> public class DuplicateEmailCreationException extends CreateException {
> >>
> >> }
> >>
> >> public class DuplicatePhoneCreationException extends CreateException {
> >>
> >> }
> >>
> >> My service is this one;
> >>
> >> @RemoteServiceRelativePath("AccountService")
> >> public interface AccountService extends RemoteService {
> >>
> >> public void createAccount(String phone, String email);
> >>
> >> }
> >>
> >> Notice I don't declare my CreateException using the "throws" keyword.
> >>
> >> Now I would expect my view to work. It's this one;
> >>
> >> ...
> >> accountServiceAsync.createAccount(tbPhone.getValue(),
> tbEmail.getValue(),
> >> new AsyncCallback<Void>() {
> >>
> >> public void onSuccess(Void result) {
> >>
> >> }
> >>
> >> public void onFailure(Throwable exception) {
> >>
> >> if ( exception instanceof DuplicatePhoneCreationException) {
> >>
> >> // handle it
> >>
> >> }
> >>
> >> else {
> >>
> >> if (exception instanceof DuplicateEmailCreationException) {
> >>
> >> // handle it
> >>
> >> }
> >> }
> >> }
> >>
> >> ...
> >>
> >> However, it does not work. But if I add the "throws CreateException" in
> the
> >> AccountService's createAccount method, it works fine.
> >>
> >> The whole point with unchecked exceptions, is that I don't have to
> define
> >> them everywhere. Is this not supported ? Or what am I doing wrong here ?
> >>
> >> Thanks,
> >>
> >> :-) Kasper
> >
> > --
> > You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> > To post to this group, send email to [email protected]
> .
> > To unsubscribe from this group, send email to
> [email protected]<google-web-toolkit%[email protected]>
> .
> > For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
> >
> >
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-web-toolkit%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to