You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by kirillkh <ki...@gmail.com> on 2010/01/19 10:22:53 UTC

StatelessLink

Hi,

I've been getting a lot of grief trying to make some of my pages stateless
in Wicket 1.4.5 with Tomcat 6.0.

Here's one thing that doesn't work. I'm trying to make a session-resistant
(but *not* bookmarkable) link on the homepage that should work no matter if
the page exists. If the page doesn't exist, I want it to be created and then
the link event handler invoked. As far as I understand, StatelessLink should
work for this purpose. However, I can't get it to work. From time to time,
clicking it produces the following error in the console:

SEVERE: unable to find listener interface ILinkListener
org.apache.wicket.WicketRuntimeException: unable to find listener interface
ILinkListener
        at
org.apache.wicket.request.target.component.BookmarkableListenerInterfaceRequestTarget.processEvents(BookmarkableListenerInterfaceRequestTarget.java:159)
        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:1428)
        at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
        at
org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
        at
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        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:233)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:619)

Sometimes I also get the following (seemingly related) error:

org.apache.wicket.protocol.http.request.InvalidUrlException:
org.apache.wicket.WicketRuntimeException: Unable to instantiate Page class:
com.my.HomePage. See below for details.
        at
org.apache.wicket.protocol.http.WebRequestCycleProcessor.resolve(WebRequestCycleProcessor.java:262)
        at org.apache.wicket.RequestCycle.step(RequestCycle.java:1310)
        at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
        at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
        at
org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
        at
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312)
        at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        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:233)
        at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.apache.wicket.WicketRuntimeException: Unable to instantiate
Page class: com.my.HomePage. See below for details.
        at
org.apache.wicket.request.AbstractRequestCycleProcessor.resolveBookmarkablePage(AbstractRequestCycleProcessor.java:286)
        at
org.apache.wicket.protocol.http.WebRequestCycleProcessor.resolve(WebRequestCycleProcessor.java:78)
        ... 20 more
Caused by: org.apache.wicket.WicketRuntimeException: Attempt to access
unknown request listener interface ILinkListener
        at
org.apache.wicket.request.AbstractRequestCycleProcessor.resolveListenerInterfaceTarget(AbstractRequestCycleProcessor.java:407)
        at
org.apache.wicket.request.AbstractRequestCycleProcessor.resolveBookmarkablePage(AbstractRequestCycleProcessor.java:266)
        ... 21 more



A reliable way to reproduce it is:
1) open the home page in the browser
2) restart the web application in Tomcat
3) click the link
Every time I perform the above steps, I either get the first exception, or
the second.

It doesn't necessarily happen immediately when the session expires (but
AFAICT it always happens some time after that). Looks like it happens when a
classloader cache in the servlet container gets garbage-collected.

I find the first stack trace especially interesting. I have traced the
execution flow in debugger, and I'm confident that the first exception
always happens after some Links get instantiated, and because Link
implements ILinkListener, at that point the RequestListenerInterface
instance for ILinkListener exists. However,
RequestListenerInterface.register() method doesn't get called during the
"resolve" step, so I must conclude that the servlet container uses the
preexisting class at that point. But when the execution flow
reachesAbstractRequestCycleProcessor.java:92 during the "process"
step, the RequestListenerInterface instance for ILinkListener can no longer
be found.

Such inconsistencies happen when one class (in this case,
AbstractRequestCycleProcessor)
is created by a different classloader than another class (ILinkListener).

What remains unclear is why I can't see other reports of the same problem on
the list. Am I doing something wrong?

Thanks,
-Kirill

Re: StatelessLink

Posted by kirillkh <ki...@gmail.com>.
Further experiments show that that stateless forms suffer from the same
issue. How come no one has run into it before?

On Tue, Jan 19, 2010 at 11:22 AM, kirillkh <ki...@gmail.com> wrote:

> Hi,
>
> I've been getting a lot of grief trying to make some of my pages stateless
> in Wicket 1.4.5 with Tomcat 6.0.
>
> Here's one thing that doesn't work. I'm trying to make a session-resistant
> (but *not* bookmarkable) link on the homepage that should work no matter if
> the page exists. If the page doesn't exist, I want it to be created and then
> the link event handler invoked. As far as I understand, StatelessLink should
> work for this purpose. However, I can't get it to work. From time to time,
> clicking it produces the following error in the console:
>
> SEVERE: unable to find listener interface ILinkListener
> org.apache.wicket.WicketRuntimeException: unable to find listener interface
> ILinkListener
>         at
> org.apache.wicket.request.target.component.BookmarkableListenerInterfaceRequestTarget.processEvents(BookmarkableListenerInterfaceRequestTarget.java:159)
>         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:1428)
>         at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
>         at
> org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
>         at
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at
> org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
>         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:233)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>         at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>         at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
>         at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
>         at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>         at
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
>         at java.lang.Thread.run(Thread.java:619)
>
> Sometimes I also get the following (seemingly related) error:
>
> org.apache.wicket.protocol.http.request.InvalidUrlException:
> org.apache.wicket.WicketRuntimeException: Unable to instantiate Page class:
> com.my.HomePage. See below for details.
>         at
> org.apache.wicket.protocol.http.WebRequestCycleProcessor.resolve(WebRequestCycleProcessor.java:262)
>         at org.apache.wicket.RequestCycle.step(RequestCycle.java:1310)
>         at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
>         at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
>         at
> org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
>         at
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312)
>         at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>         at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at
> org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
>         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:233)
>         at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>         at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
>         at
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
>         at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>         at
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
>         at
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
>         at
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
>         at
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
>         at java.lang.Thread.run(Thread.java:619)
> Caused by: org.apache.wicket.WicketRuntimeException: Unable to instantiate
> Page class: com.my.HomePage. See below for details.
>         at
> org.apache.wicket.request.AbstractRequestCycleProcessor.resolveBookmarkablePage(AbstractRequestCycleProcessor.java:286)
>         at
> org.apache.wicket.protocol.http.WebRequestCycleProcessor.resolve(WebRequestCycleProcessor.java:78)
>         ... 20 more
> Caused by: org.apache.wicket.WicketRuntimeException: Attempt to access
> unknown request listener interface ILinkListener
>         at
> org.apache.wicket.request.AbstractRequestCycleProcessor.resolveListenerInterfaceTarget(AbstractRequestCycleProcessor.java:407)
>         at
> org.apache.wicket.request.AbstractRequestCycleProcessor.resolveBookmarkablePage(AbstractRequestCycleProcessor.java:266)
>         ... 21 more
>
>
>
> A reliable way to reproduce it is:
> 1) open the home page in the browser
> 2) restart the web application in Tomcat
> 3) click the link
> Every time I perform the above steps, I either get the first exception, or
> the second.
>
> It doesn't necessarily happen immediately when the session expires (but
> AFAICT it always happens some time after that). Looks like it happens when a
> classloader cache in the servlet container gets garbage-collected.
>
> I find the first stack trace especially interesting. I have traced the
> execution flow in debugger, and I'm confident that the first exception
> always happens after some Links get instantiated, and because Link
> implements ILinkListener, at that point the RequestListenerInterface
> instance for ILinkListener exists. However,
> RequestListenerInterface.register() method doesn't get called during the
> "resolve" step, so I must conclude that the servlet container uses the
> preexisting class at that point. But when the execution flow reachesAbstractRequestCycleProcessor.java:92 during the "process"
> step, the RequestListenerInterface instance for ILinkListener can no longer
> be found.
>
> Such inconsistencies happen when one class (in this case, AbstractRequestCycleProcessor)
> is created by a different classloader than another class (ILinkListener).
>
> What remains unclear is why I can't see other reports of the same problem
> on the list. Am I doing something wrong?
>
> Thanks,
> -Kirill
>