Tapestry
  1. Tapestry
  2. TAPESTRY-2078

More understandable error messages needed when incorrect classes found in component/page packages

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 5.0
    • Fix Version/s: 5.0.11
    • Component/s: None
    • Labels:
      None

      Description

      Currently Tapestry throws confusing error message (stacktrace with java.lang.NoClassDefFoundError) when putting non component classes to the Tapestry components/pages package and these classes do not follow the same restrictions as component classes.

      For example if there is a value holder class defined within page package or a sub package inside page package with protected/public variables then NoClassDefFoundError is thrown. If they are changed to private (like component classes should) then the error goes away and class is again found

      Tapestry application path is org.example.myapp and there is a simple value object class Test defined (and used inside page Start).
      ------------------->>-------------------<code>
      package org.example.myapp.pages.test;

      public class Test {

      protected String test = "blaah";

      public String getTest()

      { return test; }


      }
      -----
      package org.example.myapp.pages;

      import org.example.myapp.pages.test.Test;

      /**
      * Start page of application myapp.
      */
      public class Start
      {

      private Test test = new Test();

      public Test getTest() { return test; }

      }


      <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
      <head>
      <title>myapp Start Page</title>
      </head>
      <body>
      <h1>myapp Start Page</h1>
      <p> $

      {test.test}

      . </p>
      </body>
      </html>

      </code>------------------->>-------------------
      Then the following stacktrace is generated:

      1. java.lang.NoClassDefFoundError
        org/example/myapp/pages/test/Test

      Stack trace

      • org.example.myapp.pages.Start.initializer(Start.java:27)
      • org.example.myapp.pages.Start.<init>(Start.java)
      • sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      • sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
      • sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
      • java.lang.reflect.Constructor.newInstance(Unknown Source)
      • org.apache.tapestry.internal.services.ReflectiveInstantiator.newInstance(ReflectiveInstantiator.java:79)
      • org.apache.tapestry.internal.structure.InternalComponentResourcesImpl.<init>(InternalComponentResourcesImpl.java:70)
      • org.apache.tapestry.internal.structure.ComponentPageElementImpl.<init>(ComponentPageElementImpl.java:528)
      • org.apache.tapestry.internal.structure.ComponentPageElementImpl.<init>(ComponentPageElementImpl.java:572)
      • org.apache.tapestry.internal.services.PageElementFactoryImpl.newRootComponentElement(PageElementFactoryImpl.java:311)
      • org.apache.tapestry.internal.services.PageLoaderProcessor.loadRootComponent(PageLoaderProcessor.java:354)
      • org.apache.tapestry.internal.services.PageLoaderProcessor.loadPage(PageLoaderProcessor.java:339)
      • org.apache.tapestry.internal.services.PageLoaderImpl.loadPage(PageLoaderImpl.java:60)
      • org.apache.tapestry.internal.services.PagePoolImpl.checkout(PagePoolImpl.java:69)
      • org.apache.tapestry.internal.services.RequestPageCacheImpl.get(RequestPageCacheImpl.java:43)
      • org.apache.tapestry.internal.services.PageRenderRequestHandlerImpl.handle(PageRenderRequestHandlerImpl.java:55)
      • org.apache.tapestry.internal.services.RootPathDispatcher.dispatch(RootPathDispatcher.java:52)
      • org.apache.tapestry.services.TapestryModule$12.service(TapestryModule.java:905)
      • org.example.myapp.services.AppModule$1.service(AppModule.java:92)
      • org.apache.tapestry.internal.services.LocalizationFilter.service(LocalizationFilter.java:43)
      • org.apache.tapestry.services.TapestryModule$2.service(TapestryModule.java:487)
      • org.apache.tapestry.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:79)
      • org.apache.tapestry.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:94)
      • org.apache.tapestry.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:85)
      • org.apache.tapestry.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:77)
      • org.apache.tapestry.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:107)
      • org.apache.tapestry.services.TapestryModule$11.service(TapestryModule.java:888)
      • org.apache.tapestry.TapestryFilter.doFilter(TapestryFilter.java:164)
      • org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
      • org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:471)
      • org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
      • org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
      • org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:633)
      • org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
      • org.mortbay.http.HttpServer.service(HttpServer.java:909)
      • org.mortbay.http.HttpConnection.service(HttpConnection.java:820)
      • org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986)
      • org.mortbay.http.HttpConnection.handle(HttpConnection.java:837)
      • org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245)
      • org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
      • org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)

        Activity

        Hide
        Howard M. Lewis Ship added a comment -

        The issue, I think, is that we are getting an Error (not an Exception) thrown. There's a number of catch(Exception) clauses that probably should change to catch(Throwable).

        Show
        Howard M. Lewis Ship added a comment - The issue, I think, is that we are getting an Error (not an Exception) thrown. There's a number of catch(Exception) clauses that probably should change to catch(Throwable).
        Hide
        Howard M. Lewis Ship added a comment -

        You'd think this:

        try

        { _workerChain.transform(transformation, model); transformation.finish(); }

        catch (Throwable ex)

        { throw new TransformationException(transformation, ex); }

        would handle it, but no such luck. Something else needs to be involved in reporting the exception properly.

        Show
        Howard M. Lewis Ship added a comment - You'd think this: try { _workerChain.transform(transformation, model); transformation.finish(); } catch (Throwable ex) { throw new TransformationException(transformation, ex); } would handle it, but no such luck. Something else needs to be involved in reporting the exception properly.

          People

          • Assignee:
            Howard M. Lewis Ship
            Reporter:
            Priit Karu
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development