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

Reply via email to