While trying to demonstrate the dangers of multiple submits, I found
Tapestry throwing NullPointerException.
Can someone who understands Tapestry's internals shed some light on
this?
To make the test possible, I emulated a slow operation by sleeping 2
seconds. The NPE then occurred on the 3rd or later click - it varied
quite a bit. Here's how I emulated the slow operation...
@ApplicationState
private MyOrder _myOrder;
Object onSuccess() {
sleep(2000); // Sleep 2 seconds to simulate slow transaction
int newQuantity = _myOrder.getQuantity() + 1;
_myOrder.setQuantity(newQuantity);
return _page2;
}
private void sleep(long duration) {
try {
Thread.sleep(duration);
}
catch (InterruptedException e) {
}
}
Here's the exception...
22:45:53,443 ERROR [RequestExceptionHandler] Processing of request
failed with uncaught exception: java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.tapestry.internal.services.InternalModule
$2.getCookies(InternalModule.java:307)
at $CookieSource_11759363dd0.getCookies($CookieSource_11759363dd0.java)
at
org
.apache
.tapestry
.internal.services.CookiesImpl.readCookieValue(CookiesImpl.java:53)
at $Cookies_11759363dcf.readCookieValue($Cookies_11759363dcf.java)
at
org
.apache
.tapestry
.services
.PersistentLocaleImpl.getCookieValue(PersistentLocaleImpl.java:46)
at
org
.apache
.tapestry.services.PersistentLocaleImpl.get(PersistentLocaleImpl.java:
40)
at
$PersistentLocale_11759363dce.get($PersistentLocale_11759363dce.java)
at
org
.apache
.tapestry
.internal
.services
.LocalizationSetterImpl.setThreadLocale(LocalizationSetterImpl.java:98)
at
$
LocalizationSetter_11759363dcb
.setThreadLocale($LocalizationSetter_11759363dcb.java)
at
org
.apache
.tapestry
.internal.services.LocalizationFilter.service(LocalizationFilter.java:
41)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at org.apache.tapestry.services.TapestryModule
$2.service(TapestryModule.java:688)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at
org
.apache
.tapestry
.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:84)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at org.apache.tapestry.internal.services.CheckForUpdatesFilter
$2.invoke(CheckForUpdatesFilter.java:97)
at org.apache.tapestry.internal.services.CheckForUpdatesFilter
$2.invoke(CheckForUpdatesFilter.java:88)
at
org
.apache
.tapestry
.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:77)
at
org
.apache
.tapestry
.internal
.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:110)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at
$RequestHandler_11759363dc6.service($RequestHandler_11759363dc6.java)
at org.apache.tapestry.services.TapestryModule
$12.service(TapestryModule.java:1086)
at
$
HttpServletRequestHandler_11759363dc5
.service($HttpServletRequestHandler_11759363dc5.java)
at org.apache.tapestry.TapestryFilter.doFilter(TapestryFilter.java:135)
at
org
.apache
.catalina
.core
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org
.apache
.catalina
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org
.jboss
.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:
96)
at
org
.apache
.catalina
.core
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org
.apache
.catalina
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org
.apache
.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
230)
at
org
.apache
.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
175)
at
org
.jboss
.web
.tomcat
.security
.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
at
org
.jboss
.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at
org
.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
127)
at
org
.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
102)
at
org
.jboss
.web
.tomcat
.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:
157)
at
org
.apache
.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
262)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
844)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
446)
at java.lang.Thread.run(Thread.java:613)
22:45:53,449 ERROR [ExceptionReport] Render queue error in
BeginRender[core/ExceptionReport:renderobject_0]:
org.apache.tapestry.ioc.internal.util.TapestryException
org.apache.tapestry.ioc.internal.util.TapestryException [at
classpath:org/apache/tapestry/corelib/pages/ExceptionReport.tml, line
45, column 41]
at
org
.apache
.tapestry
.internal
.structure
.ComponentPageElementImpl.invoke(ComponentPageElementImpl.java:935)
at
org.apache.tapestry.internal.structure.ComponentPageElementImpl.access
$100(ComponentPageElementImpl.java:69)
at org.apache.tapestry.internal.structure.ComponentPageElementImpl
$10.render(ComponentPageElementImpl.java:349)
at
org
.apache
.tapestry.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:58)
at
org
.apache
.tapestry
.internal
.services
.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:40)
at
$
PageMarkupRenderer_11759363e09
.renderPageMarkup($PageMarkupRenderer_11759363e09.java)
at
org
.apache
.tapestry
.internal
.services
.PageResponseRendererImpl
.renderPageResponse(PageResponseRendererImpl.java:71)
at
$
PageResponseRenderer_11759363ddb
.renderPageResponse($PageResponseRenderer_11759363ddb.java)
at
org
.apache
.tapestry
.internal
.services
.DefaultRequestExceptionHandler
.handleRequestException(DefaultRequestExceptionHandler.java:60)
at
$
RequestExceptionHandler_11759363dca
.handleRequestException($RequestExceptionHandler_11759363dca.java)
at org.apache.tapestry.services.TapestryModule
$2.service(TapestryModule.java:697)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at
org
.apache
.tapestry
.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:84)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at org.apache.tapestry.internal.services.CheckForUpdatesFilter
$2.invoke(CheckForUpdatesFilter.java:97)
at org.apache.tapestry.internal.services.CheckForUpdatesFilter
$2.invoke(CheckForUpdatesFilter.java:88)
at
org
.apache
.tapestry
.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:77)
at
org
.apache
.tapestry
.internal
.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:110)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at
$RequestHandler_11759363dc6.service($RequestHandler_11759363dc6.java)
at org.apache.tapestry.services.TapestryModule
$12.service(TapestryModule.java:1086)
at
$
HttpServletRequestHandler_11759363dc5
.service($HttpServletRequestHandler_11759363dc5.java)
at org.apache.tapestry.TapestryFilter.doFilter(TapestryFilter.java:135)
at
org
.apache
.catalina
.core
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org
.apache
.catalina
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org
.jboss
.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:
96)
at
org
.apache
.catalina
.core
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org
.apache
.catalina
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org
.apache
.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
230)
at
org
.apache
.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
175)
at
org
.jboss
.web
.tomcat
.security
.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
at
org
.jboss
.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at
org
.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
127)
at
org
.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
102)
at
org
.jboss
.web
.tomcat
.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:
157)
at
org
.apache
.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
262)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
844)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
446)
at java.lang.Thread.run(Thread.java:613)
Caused by: java.lang.NullPointerException
at $Request_11759363def.getContextPath($Request_11759363def.java)
at $Request_11759363dc0.getContextPath($Request_11759363dc0.java)
at
org
.apache
.tapestry
.internal.services.RequestRenderer.render(RequestRenderer.java:34)
at
org
.apache
.tapestry
.internal.services.RequestRenderer.render(RequestRenderer.java:24)
at $ObjectRenderer_11759363ec6.render($ObjectRenderer_11759363ec6.java)
at $ObjectRenderer_11759363dad.render($ObjectRenderer_11759363dad.java)
at
org
.apache
.tapestry
.corelib.components.RenderObject.beginRender(RenderObject.java:39)
at
org
.apache
.tapestry.corelib.components.RenderObject.beginRender(RenderObject.java)
at org.apache.tapestry.internal.structure.ComponentPageElementImpl
$10$1.run(ComponentPageElementImpl.java:345)
at
org
.apache
.tapestry
.internal
.structure
.ComponentPageElementImpl.invoke(ComponentPageElementImpl.java:923)
... 40 more
22:45:53,450 ERROR [PagePool] Page Page[core/ExceptionReport en_US] is
dirty, and will be discarded (rather than returned to the page pool).
22:45:53,450 ERROR [[default]] Servlet.service() for servlet default
threw exception
org.apache.tapestry.ioc.internal.util.TapestryException [at
classpath:org/apache/tapestry/corelib/pages/ExceptionReport.tml, line
45, column 41]
at
org
.apache
.tapestry
.internal
.structure
.ComponentPageElementImpl.invoke(ComponentPageElementImpl.java:935)
at
org.apache.tapestry.internal.structure.ComponentPageElementImpl.access
$100(ComponentPageElementImpl.java:69)
at org.apache.tapestry.internal.structure.ComponentPageElementImpl
$10.render(ComponentPageElementImpl.java:349)
at
org
.apache
.tapestry.internal.services.RenderQueueImpl.run(RenderQueueImpl.java:58)
at
org
.apache
.tapestry
.internal
.services
.PageMarkupRendererImpl.renderPageMarkup(PageMarkupRendererImpl.java:40)
at
$
PageMarkupRenderer_11759363e09
.renderPageMarkup($PageMarkupRenderer_11759363e09.java)
at
org
.apache
.tapestry
.internal
.services
.PageResponseRendererImpl
.renderPageResponse(PageResponseRendererImpl.java:71)
at
$
PageResponseRenderer_11759363ddb
.renderPageResponse($PageResponseRenderer_11759363ddb.java)
at
org
.apache
.tapestry
.internal
.services
.DefaultRequestExceptionHandler
.handleRequestException(DefaultRequestExceptionHandler.java:60)
at
$
RequestExceptionHandler_11759363dca
.handleRequestException($RequestExceptionHandler_11759363dca.java)
at org.apache.tapestry.services.TapestryModule
$2.service(TapestryModule.java:697)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at
org
.apache
.tapestry
.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:84)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at org.apache.tapestry.internal.services.CheckForUpdatesFilter
$2.invoke(CheckForUpdatesFilter.java:97)
at org.apache.tapestry.internal.services.CheckForUpdatesFilter
$2.invoke(CheckForUpdatesFilter.java:88)
at
org
.apache
.tapestry
.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:77)
at
org
.apache
.tapestry
.internal
.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:110)
at
$RequestHandler_11759363dcd.service($RequestHandler_11759363dcd.java)
at
$RequestHandler_11759363dc6.service($RequestHandler_11759363dc6.java)
at org.apache.tapestry.services.TapestryModule
$12.service(TapestryModule.java:1086)
at
$
HttpServletRequestHandler_11759363dc5
.service($HttpServletRequestHandler_11759363dc5.java)
at org.apache.tapestry.TapestryFilter.doFilter(TapestryFilter.java:135)
at
org
.apache
.catalina
.core
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org
.apache
.catalina
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org
.jboss
.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:
96)
at
org
.apache
.catalina
.core
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org
.apache
.catalina
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at
org
.apache
.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
230)
at
org
.apache
.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
175)
at
org
.jboss
.web
.tomcat
.security
.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
at
org
.jboss
.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at
org
.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
127)
at
org
.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
102)
at
org
.jboss
.web
.tomcat
.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:
157)
at
org
.apache
.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
262)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
844)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
446)
at java.lang.Thread.run(Thread.java:613)
Caused by: java.lang.NullPointerException
at $Request_11759363def.getContextPath($Request_11759363def.java)
at $Request_11759363dc0.getContextPath($Request_11759363dc0.java)
at
org
.apache
.tapestry
.internal.services.RequestRenderer.render(RequestRenderer.java:34)
at
org
.apache
.tapestry
.internal.services.RequestRenderer.render(RequestRenderer.java:24)
at $ObjectRenderer_11759363ec6.render($ObjectRenderer_11759363ec6.java)
at $ObjectRenderer_11759363dad.render($ObjectRenderer_11759363dad.java)
at
org
.apache
.tapestry
.corelib.components.RenderObject.beginRender(RenderObject.java:39)
at
org
.apache
.tapestry.corelib.components.RenderObject.beginRender(RenderObject.java)
at org.apache.tapestry.internal.structure.ComponentPageElementImpl
$10$1.run(ComponentPageElementImpl.java:345)
at
org
.apache
.tapestry
.internal
.structure
.ComponentPageElementImpl.invoke(ComponentPageElementImpl.java:923)
... 40 more
Thanks,
Geoff