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
>
>

Reply via email to