Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Excerpt
hiddentrue
  • HTTP, Non-HTTP, and Displaying


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

To display an error (or any message for that matter: info/warning) in an HTML page use a FeedbackPanel:

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

...