Uploaded image for project: 'RESTEasy'
  1. RESTEasy
  2. RESTEASY-391

RESTeasy is unable to dispatch to resource classes with generic super-interfaces.

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 2.0-beta-3
    • 2.0-beta-2
    • jaxrs
    • None
    • Hide

      To reproduce the issue:

      $ git clone ssh://git.fedorahosted.org/git/rhevm-api.git
      $ cd rhevm-api
      $ git checkout origin/error-onwards
      $ mvn install -Dmaven.test.skip=true
      $ cd dummy/webapp
      $ mvn jetty:run &
      $ cd ../..
      $ ./python/test.py --port=8099

      Show
      To reproduce the issue: $ git clone ssh://git.fedorahosted.org/git/rhevm-api.git $ cd rhevm-api $ git checkout origin/error-onwards $ mvn install -Dmaven.test.skip=true $ cd dummy/webapp $ mvn jetty:run & $ cd ../.. $ ./python/test.py --port=8099

      Our application follows the sub-resource locator pattern, creating a number of resource instances that implement generic super-interfaces.

      The problematic cases have the following inheritance patterns:

      class1 -implements> interface1 --extends-> generic super-interface<R>
      \
      +-extends-> generic abstract-base-class<R>

      class2 -implements> interface2 --extends-> generic super-interface<R>
      \
      +-extends> abstract-base-class --extends-> generic abstract-base-class<R>

      In both cases, the org.jboss.resteasy.util.Types utility fails to find the generic parameter type R and hence aborts the dispatch to the sub-resource instances created by application.

      A fix is contained in the attached patch, which walks the generic super-interface hierarchy, in addition to the super-classes.

      The problem occurs with the following stack trace being emitted by the RESTeasy runtime:

      9910 [3919472@qtp-16491778-2] ERROR org.jboss.resteasy.core.SynchronousDispatcher - Unknown exception while executing GET /hosts/3
      java.lang.RuntimeException: Unable to determine value of type parameter R
      at org.jboss.resteasy.util.Types.getActualValueOfTypeVariable(Types.java:309)
      at org.jboss.resteasy.core.MethodInjectorImpl.<init>(MethodInjectorImpl.java:66)
      at org.jboss.resteasy.core.InjectorFactoryImpl.createMethodInjector(InjectorFactoryImpl.java:54)
      at org.jboss.resteasy.core.ResourceMethod.<init>(ResourceMethod.java:66)
      at org.jboss.resteasy.core.ResourceMethodRegistry.processMethod(ResourceMethodRegistry.java:178)
      at org.jboss.resteasy.core.ResourceMethodRegistry.addResourceFactory(ResourceMethodRegistry.java:123)
      at org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(ResourceLocator.java:134)
      at org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:107)
      at org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(ResourceLocator.java:147)
      at org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:92)
      at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:486)
      at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:463)
      at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:117)
      at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:198)
      at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:48)
      at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:43)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
      at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
      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 org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
      at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
      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.headerComplete(HttpConnection.java:924)
      at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
      at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
      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)
      2010-05-08 09:50:31.738:WARN::/rhevm-api-dummy/hosts/3
      org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Unable to determine value of type parameter R
      at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:216)
      at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:172)
      at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:501)
      at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:463)
      at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:117)
      at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:198)
      at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:48)
      at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:43)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
      at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
      at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
      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 org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
      at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
      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.headerComplete(HttpConnection.java:924)
      at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
      at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
      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)

            patriot1burke@gmail.com Bill Burke (Inactive)
            eglynn_jira Eoghan Glynn (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved: