Hi,
We have a really annoying problem for some time in one of our Wicket
applications.
When a stateful page is expired, Wicket tries to rerender the page
(nice!) but without the PageParameters (not nice: our page needs the
parameter to be rendered).
The pageParameters are set to null if there is a page id in processListener:
// WICKET-4594 - ignore the parsed parameters for stateful pages
pageParameters = null;
It looks like it's something wanted as it's supposed to fix a bug but
I don't really understand why we would want that.
As it looks like a tricky subject and I'm not sure we can find a good
compromise for everyone, I'm working on a local workaround to fix it
locally. I'm pretty sure people might be interested in a valid
workaround for this issue.
I was wondering if using something like:
@Override
protected IRequestHandler processListener(PageComponentInfo
pageComponentInfo,
Class<? extends IRequestablePage> pageClass,
PageParameters pageParameters) {
PageParameters currentRequestPageParameters = new
PageParameters(pageParameters);
IRequestHandler handler =
super.processListener(pageComponentInfo, pageClass, pageParameters);
if (handler instanceof ListenerInterfaceRequestHandler) {
ListenerInterfaceRequestHandler listenerPageHandler =
(ListenerInterfaceRequestHandler) handler;
if (listenerPageHandler.getPageParameters() == null &&
currentRequestPageParameters != null &&
currentRequestPageParameters.getNamedKeys().size() > 0) {
PageProvider provider = new PageProvider(pageClass,
currentRequestPageParameters);
provider.setPageSource(getContext());
handler = new RenderPageRequestHandler(provider,
RedirectPolicy.ALWAYS_REDIRECT);
}
}
return handler;
}
in a MountedMapper could do the trick?
It works as far as I can test it but I'm wondering if there might be
something fishy there or side effects I should be aware of.
We are using the PageParameterAwareMountedMapper of Johannes [1] and
there's a comment in the code I can't really explain:
// This check is necessary to prevent a
// RestartResponseAtInterceptPageException at the wrong time in
// request cycle
if (provider.hasPageInstance()) {
In my case, I won't have a page instance as the page is expired and I
don't see why the processListener method could be called twice but I
think it might be worth asking for advice.
Thanks for your feedback.
[1]
https://github.com/unterstein/wicket-tales/blob/master/src/main/java/org/wickettales/request/mapper/PageParameterAwareMountedMapper.java