Hi, You can also use PageRequestHandlerTracker to get a reference to the requested page (first handler) and to the response page (last handler). Everything else looks good to me!
Martin Grigorov Wicket Training and Consulting https://twitter.com/mtgrigorov On Wed, Sep 7, 2016 at 11:36 AM, Joachim Rohde <j...@solvit.de> wrote: > Hi, > > I need to enrich the ExceptionErrorPage with some additional information. > Currently I have a working solution but I'm > not sure, if this is the correct way. > > My first try was (in my Application-class): > > /** > * Define our own exception mapper. > */ > @Override > public IProvider<IExceptionMapper> getExceptionMapperProvider() { > return new IProvider<IExceptionMapper>() { > > @Override > public IExceptionMapper get() { > return new MyCustomExceptionMapper(); > } > }; > } > > /** > * Our own exception mapper, so that we can display further > information on the error page > * in case of an exception. > */ > public class MyCustomExceptionMapper extends DefaultExceptionMapper { > > @Override > public IRequestHandler map(Exception e) { > return new RenderPageRequestHandler(new PageProvider(new > MyErrorPage(e, super.extractCurrentPage()))); > } > > } > > MyErrorPage extends from ExceptionErrorPage and overwrites > getErrorMessage(Throwable throwable). > > During development this works just fine but it was not feeling right. > Therefore I proposed a patch to implement a > hook-method (https://issues.apache.org/jira/browse/WICKET-6240) where > Martin mentioned: > > "The recommended way to do this is to register custom > IRequestCycleListener and override its #onException() method. > If the exception is IWicketInternalException then return null, otherwise > return RenderPageRequestHandler with a custom > page that renders all the information you need." > > So, at the moment I'm having in my init-method: > > getRequestCycleListeners().add(new AbstractRequestCycleListener() { > @Override > public IRequestHandler onException(RequestCycle cycle, > Exception ex) { > if (ex instanceof IWicketInternalException) { > return null; > } else { > Page page = null; > > IRequestHandler handler = > cycle.getActiveRequestHandler(); > > if (handler == null) { > handler = cycle.getRequestHandlerScheduledAfte > rCurrent(); > } > > if (handler instanceof IPageRequestHandler) { > IPageRequestHandler pageRequestHandler = > (IPageRequestHandler) handler; > page = (Page) pageRequestHandler.getPage(); > } > > return new RenderPageRequestHandler(new > PageProvider(new MyErrorPage(ex, page))); > } > } > > }); > > The code to retrieve the page comes basically from > DefaultExceptionMapper#extractCurrentPage(). > My question: is this the > way to go? Or can I simplify the code any further? > > Joachim > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > >