001package common.http.error;
002
003import java.lang.annotation.ElementType;
004import java.lang.annotation.Retention;
005import java.lang.annotation.RetentionPolicy;
006import java.lang.annotation.Target;
007
008/**
009 * <p>L'annotazione consente di impostare in modo dichiarativo il percorso su cui una servlet effettua
010 * il dispatch in caso di errore.</p>
011 * <p>Affinché funzioni, è necessario che la servlet su cui applicare l'annotazione estenda {@link common.http.interceptor.InterceptableServlet}</p>
012 * <p>È possibile applicare l'annotazione ai singoli metodi "doX" implementati (es. doGet). Applicare l'annotazione
013 * direttamente alla classe equivale ad applicarla su tutti i metodi "doX" implementati.</p>
014 * <p>Quando un metodo "doX" annotato con {@link ForwardOnError} lancia una particolare eccezione
015 * (elencate in basso), si verificano le seguenti azioni: </p>
016 * <ul>
017 *     <li>Viene catturata l'eccezione allo scopo di recuperare i messaggi di errore rilevanti
018 *     per inserirli nell'attributo di richiesta <pre>errors</pre></li>
019 *     <li>Viene impostato lo status code 400 BAD REQUEST</li>
020 *     <li>Viene passato il controllo (mediante metodo <pre>forward</pre> alla servlet al percorso specificato)</li>
021 * </ul>
022 * <p>Le eccezioni catturate sono le seguenti:  </p>
023 * <table>
024 *     <tr>
025 *         <td>Eccezione</td><td>Messaggi di errore</td>
026 *     </tr>
027 *     <tr>
028 *         <td>{@link javax.validation.ConstraintViolationException}</td><td>I messaggi degli oggetti {@link javax.validation.ConstraintViolation}</td>
029 *     </tr>
030 *     <tr>
031 *         <td>{@link IllegalArgumentException}</td><td>{@link IllegalArgumentException#getMessage()}</td>
032 *     </tr>
033 * </table>
034 * @see ForwardOnErrorInterceptor
035 * @see common.http.interceptor.InterceptableServlet
036 * @see common.http.interceptor.ServletInterceptor
037 */
038@Target({ElementType.METHOD,ElementType.TYPE})
039@Retention(RetentionPolicy.RUNTIME)
040public @interface ForwardOnError {
041    /**
042     * @return L'URL pattern dove effettuare il forward della richiesta
043     */
044    String value();
045}