Excerpt | ||
---|---|---|
| ||
|
How do I add custom error pages?
Non-HTTP Error Pages
In your application class that extends WebApplication, set the following in the init() method:
...
There are also some other neat settings you should check out in getApplicationSettings()
, getDebugSettings()
, getExceptionSettings()
, getMarkupSettings()
, getPageSettings()
, getRequestCycleSettings()
, getSecuritySettings
and getSessionSettings()
. See the javadoc for more information.
If calling setInternalErrorPage()
, make sure to also call:
Code Block |
---|
// show internal error page rather than default developer page getExceptionSettings().setUnexpectedExceptionDisplay(IExceptionSettingsExceptionSettings.SHOW_INTERNAL_ERROR_PAGE); |
...
Code Block |
---|
getRequestCycle().onRuntimeException(new MyErrorPage(), theException); |
HTTP Error Pages
First ensure that the wicket filter-mapping in your web.xml has the following dispatchers:
...
This is assuming that you have mapped "/404" in your WebApplication:
Code Block |
---|
mountmountPage(new HybridUrlCodingStrategy("/404", PageNotFound.class)); |
In your error WebPage:
Code Block |
---|
public class PageNotFound extends WebPage { private static final long serialVersionUID = 1L; public PageNotFound() { // Add any necessary components } @Override protected void configureResponse() { super.configureResponse(); getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.SC_NOT_FOUND); } @Override public boolean isVersioned() { return false; } @Override public boolean isErrorPage() { return true; } } |
An HTTP error can be thrown manually by:
Code Block |
---|
// also see AbortWithWebErrorCodeException and AbortWithHttpStatusException
throw new AbortWithHttpStatusException(404, true);
|
For wicket 6 and beyond:
Code Block |
---|
throw new AbortWithHttpErrorCodeException(404, "Some message");
|
Overriding All Error Pages for RuntimeException
Sometimes it is desirable to override all of Wicket's error pages with a custom error page(s) when any RuntimeException occurs. Here is an example of how to do so.
Code Block |
---|
public final class MyRequestCycle extends WebRequestCycle {
/**
* MyRequestCycle constructor
*
* @param application the web application
* @param request the web request
* @param response the web response
*/
public WebRequestCycle(final WebApplication application, final WebRequest request, final Response response) {
super(application, request, response);
}
/**
* {@inheritDoc}
*/
@Override
protected final Page onRuntimeException(final Page cause, final RuntimeException e) {
// obviously you can check the instanceof the exception and return the appropriate page if desired
return new MyExceptionPage(e);
}
}
|
Then in your WebApplication class :
Code Block |
---|
/**
* {@inheritDoc}
*/
@Override
public final RequestCycle newRequestCycle(final Request request, final Response response) {
return new MyRequestCycle (this, (WebRequest)request, (WebResponse)response);
}
|
How do I add/display errors?
Normally all that is needed to display errors in a page is to call the "error" method in the WebPage:
...
Code Block |
---|
getSession().error(message); throw new RestartResponseException(MyErrorPage.class, optionalPageParameters); // use RestartResponseAtInterceptPageException(MyErrorPage.class); // instead to interrupt current request processing and immediately redirect to an intercept page // it may be tempting to do the following, but it should not be done: // error(message); // setResponsePage(MyErrorPage.class); // Why not? // What about this; will it work? (My experience says no, but I don't know why not.) // getSession().error(message); // setRedirect(true); // setResponsePage(MyErrorPage.class); |
...
Code Block |
---|
<!-- In the HTML page --> <div wicket:id="feedback">[Feedback Panel]</div> // In WebPage add(new FeedbackPanel("feedback")); |
How do I add/display errors at the component level?
See ComponentFeedbackPanel, FormComponentFeedbackBorder, and FormComponentFeedbackIndicator
// TODO : add example that adds error messages to individual form components of the page
I get 'Internal error cloning object' errors
This is a debug feature to help find potential problems when the application runs clustered. It checks the component graphs to make sure everything is serializable (which is required for clustering).
...