/* Copyright 2005-2006 Tim Fennell * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.sourceforge.stripes.validation; import net.sourceforge.stripes.action.Resolution; /** * <p>Interface that can be implemented by ActionBeans to be notified of ValidationErrors that * occur during validation and binding. In the case where an ActionBean does not implement * this interface, the errors are marshalled, the user is returned to the page from which * they came and the ActionBean instance is discarded.</p> * * <p>Implementing this interface gives ActionBeans the chance to modify what happens when the * binding and/or validation phase(s) generate errors. The handleValidationErrors method is * invoked after all validation has completed - i.e. after annotation based validation and any * {@link ValidationMethod}s that are applicable for the current request. Invocation only happens * when one or more validation errors exist. Also, note that {@code setContext()} will always have * been invoked prior to {@link #handleValidationErrors(ValidationErrors)}, allowing the bean * access to the event name and other information.</p> * * <p>When the {@link #handleValidationErrors(ValidationErrors)} method is invoked, the * {@link net.sourceforge.stripes.action.ActionBean} may do one or more of the following:</p> * * <ul> * <li>Modify its own internal state, e.g. unwind changes made by complex setter methods</li> * <li>Remove validation errors from the ValidationErrors object</li> * <li>Add new validation errors to the ValidationErrors object</li> * <li>Modify errors in the ValidationErrors object</li> * <li>Any other operation, e.g. rollback a transaction, log an audit message etc.</li> * <li>(Optionally) Re-direct the flow of execution by returning a substitute Resolution</li> * </ul> * * <p>For example, if you want to override the validation service's results and continue * execution, you might invoke {@code errors.clear()} to remove all the errors. Doing this makes it * as though the errors had never been generated! Or perhaps for a specific ActionBean you'd * like to redirect to a different error page instead of the page the user came from, in that * case you can simply return a new {@link net.sourceforge.stripes.action.ForwardResolution} or * {@link net.sourceforge.stripes.action.RedirectResolution} to change where the user will be sent.</p> * * <p>Returning a {@link Resolution} from this method is stricly <b>optional</b>. If a Resolution is * returned it will be executed instead of the error resolution. If null is returned (and one * or more errors persist) then the error resolution will be executed as normal.</p> * * @author Tim Fennell */ public interface ValidationErrorHandler { /** * Allows the ActionBean to influence what happens when validation errors occur during * validation and binding. See class level javadoc for full description of behaviour. * * @param errors the set of validation errors generated during validation and binding * @return null, or a Resolution specifying what should happen next if non-standard * behaviour is desired * @throws Exception may throw any exception, but this will generally result in a * ServletException being thrown on up the stack */ Resolution handleValidationErrors(ValidationErrors errors) throws Exception; }