Help! team wants to abandon GAE because our Wicket app fails to run

76 views
Skip to first unread message

David Donohue

unread,
Jul 3, 2011, 6:49:26 AM7/3/11
to Google App Engine
Hello! We have spent many hours working on a Wicket-based Java web
application for Google App Engine.
Our application runs properly on our Eclipse-based local development
environment (SDK version 1.4.3).
However, When we deploy to app engine, our session objects are
returning null. Our development team has become quite impatient with
app engine, and is working or porting the app to run other
technologies like Hibernate JPA. Error trace below

Thanks for any help!
Dave Donohue

2011-07-03 03:43:04.685 /inqle/;jsessionid=ayZp3ggilt1PrWp0iRIuEQ?
wicket:bookmarkablePage=:org.inqle.qa.web.pages.questions.QuestionaryPage
500 587ms 1412cpu_ms 12api_cpu_ms 0kb Mozilla/5.0 (Windows NT 6.1;
WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112
Safari/534.30,gzip(gfe)
173.49.156.228 - drdonohue [03/Jul/2011:03:43:04 -0700] "GET /
inqle/;jsessionid=ayZp3ggilt1PrWp0iRIuEQ?
wicket:bookmarkablePage=:org.inqle.qa.web.pages.questions.QuestionaryPage
HTTP/1.1" 500 963 "http://inqle-qa.appspot.com/inqle/" "Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/
12.0.742.112 Safari/534.30,gzip(gfe)" "inqle-qa.appspot.com" ms=587
cpu_ms=1412 api_cpu_ms=12 cpm_usd=0.039455
E 2011-07-03 03:43:04.616
org.apache.wicket.RequestCycle logRuntimeException: Can't instantiate
page using constructor public
org.inqle.qa.web.pages.questions.QuestionaryPage()
org.apache.wicket.WicketRuntimeException: Can't instantiate page using
constructor public org.inqle.qa.web.pages.questions.QuestionaryPage()
at
org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:
212)
at
org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:
57)
at
org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:
298)
at
org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:
320)
at
org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:
234)
at
org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:
92)
at
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:
1250)
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
at
org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:
486)
at
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:
319)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.inject.servlet.DefaultFilterPipeline.dispatch(DefaultFilterPipeline.java:
43)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:
110)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:
97)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:
35)
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
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.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:
249)
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:923)
at
com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:
76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at
com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:
135)
at
com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:
260)
at com.google.apphosting.base.RuntimePb$EvaluationRuntime
$2.handleRequest(RuntimePb.java:9673)
at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:
422)
at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:
573)
at com.google.tracing.TraceContext$TraceContextRunnable
$1.run(TraceContext.java:448)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:
688)
at com.google.tracing.TraceContext
$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:
326)
at com.google.tracing.TraceContext
$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:
318)
at com.google.tracing.TraceContext
$TraceContextRunnable.run(TraceContext.java:446)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1110)
at java.util.concurrent.ThreadPoolExecutor
$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:636)
Caused by: java.lang.reflect.InvocationTargetException
at
com.google.appengine.runtime.Request.process-690d8e3f0bc6a46e(Request.java)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:
57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:
45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:33)
at
org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:
192)
at
org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:
57)
at
org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:
298)
at
org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:
320)
at
org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:
234)
at
org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:
92)
at
org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:
1250)
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1436)
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
at
org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:
486)
at
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:
319)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at
com.google.inject.servlet.DefaultFilterPipeline.dispatch(DefaultFilterPipeline.java:
43)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:
110)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
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
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:923)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
... 10 more
Caused by: java.lang.NullPointerException
at org.inqle.qa.web.InqleQaSession.isParticipant(InqleQaSession.java:
171)
at org.inqle.qa.web.InqleQaSession.getParticipant(InqleQaSession.java:
180)
at
org.inqle.qa.web.pages.questions.QuestionaryPage.createContentPanel(QuestionaryPage.java:
32)
at org.inqle.qa.web.pages.PrivatePage.<init>(PrivatePage.java:22)
at
org.inqle.qa.web.pages.PrivateDetailPage.<init>(PrivateDetailPage.java:
14)
at
org.inqle.qa.web.pages.questions.QuestionaryPage.<init>(QuestionaryPage.java:
20)

Stephen Johnson

unread,
Jul 4, 2011, 5:23:49 PM7/4/11
to google-a...@googlegroups.com
Do you have sessions enabled in your appengine-web.xml file??

<sessions-enabled>true</sessions-enabled>

Stephen

> --
> You received this message because you are subscribed to the Google Groups "Google App Engine" group.
> To post to this group, send email to google-a...@googlegroups.com.
> To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.
>
>

zdravko

unread,
Jul 4, 2011, 5:43:30 PM7/4/11
to Google App Engine
If you are not getting the buy -n from the rest of your "team" then
give up because the lazy slobs will be blaming you for everything.

David Donohue

unread,
Jul 4, 2011, 6:19:16 PM7/4/11
to Google App Engine
Stephen,
Thanks for your reply! Yes we have
<sessions-enabled>true</sessions-enabled>

in war/WEB-INF/appengine-web.xml

Any other ideas?
Best,
Dave

Stephen Johnson

unread,
Jul 4, 2011, 6:27:32 PM7/4/11
to google-a...@googlegroups.com
Sorry can't help much since don't know what's occurring inside these
methods. My suggestion was only based on you stating that Session is
null but no way to know for sure if Session is really null. Perhaps it
is something that is being put into the Session and that is coming
back out as null. Are you placing anything in to the Session object
that is not Serializable. The development server will allow this while
production since it is distributed and session is serialized/stored in
the datastore will not.

Caused by: java.lang.NullPointerException
at org.inqle.qa.web.InqleQaSession.isParticipant(InqleQaSession.java:
171)
at org.inqle.qa.web.InqleQaSession.getParticipant(InqleQaSession.java:
180)

Stephen Johnson

unread,
Jul 4, 2011, 6:29:55 PM7/4/11
to google-a...@googlegroups.com
Also, make sure that anything referenced by anything that is put in to
session is also serializable or otherwise marked as transient as
necessary.

David Donohue

unread,
Jul 5, 2011, 6:32:03 AM7/5/11
to google-a...@googlegroups.com
Stephen,
Yes! This seems to be the issue. This is a key insight - I am adding
testing of object serialization to all my JUnit testing code, for my
GAE app.

Specifically the problem is with java.util.logging.Logger, which I
inject all over the place using Guice. The object I am serializing
contains multiple other objects of mine. Each object has its own
Logger. So I suppose the workaround will be to replace each
java.util.logging.Logger with my own, serializable logger?
Best,
Dave Donohue

Stephen Johnson

unread,
Jul 5, 2011, 11:59:12 AM7/5/11
to google-a...@googlegroups.com
Awesome! Glad I could be of some help. I'm not sure about your
particular situation but serializing the loggers doesn't seem like it
may be what you want to do but who am I to say. Alternatively you can
mark those fields as transient and then they won't be serialized. You
can then add your own readObject() and writeObject() methods to the
class to re-add the java.util.Logger objects when you're classes are
deserialized.
Stephen

Stephen Johnson

unread,
Jul 5, 2011, 12:17:31 PM7/5/11
to google-a...@googlegroups.com
Again, I'm not sure why your Loggers are instance variables, but I
just make mine a final static variable of that class

private static final Logger log = Logger.getLogger(Whatever.class.getName());

Stephen Johnson

unread,
Jul 5, 2011, 12:18:19 PM7/5/11
to google-a...@googlegroups.com
Just to be clear, then since it's static it won't be serialized and
this would solve your issue as well.

Paul

unread,
Jul 6, 2011, 2:44:09 AM7/6/11
to Google App Engine
David:

Wicket community is extremely fast when it comes to help, so try
asking on their forum. I am really amazed at how fast you can get
solution for your problem. One more reason to use Wicket on GAE :)
Reply all
Reply to author
Forward
0 new messages