1 package common.http.error;
2
3 import usecase.auth.BannedUserException;
4
5 import java.lang.annotation.ElementType;
6 import java.lang.annotation.Retention;
7 import java.lang.annotation.RetentionPolicy;
8 import java.lang.annotation.Target;
9
10 /**
11 * <p>L'annotazione consente di impostare in modo dichiarativo se inviare eventuali errori in formato JSON nel corpo della risposta</p>
12 * <p>Affinché funzioni, è necessario che la servlet su cui applicare l'annotazione estenda {@link common.http.interceptor.InterceptableServlet}</p>
13 * <p>È possibile applicare l'annotazione ai singoli metodi "doX" implementati (es. doGet). Applicare l'annotazione
14 * direttamente alla classe equivale ad applicarla su tutti i metodi "doX" implementati.</p>
15 * <p>Quando un metodo "doX" annotato con {@link JSONError} lancia una particolare eccezione
16 * (elencata in basso), si verificano le seguenti azioni: </p>
17 * <ul>
18 * <li>Viene catturata l'eccezione allo scopo di recuperare i messaggi di errore rilevanti
19 * per inserirli nell'attributo di richiesta <pre>errors</pre></li>
20 * <li>I messaggi raccolti vengono inclusi in un array JSON con chiave <pre>errors</pre></li>
21 * <li>Viene impostato l'apposito status code a seconda dell'eccezione catturata</li>
22 * <li>Il JSON risultante viene scritto sulla risposta</li>
23 * </ul>
24 * <p>Le eccezioni catturate sono le seguenti: </p>
25 * <table>
26 * <tr>
27 * <td>Eccezione</td><td>Messaggi di errore</td><td>Status code</td>
28 * </tr>
29 * <tr>
30 * <td>{@link javax.validation.ConstraintViolationException}</td><td>I messaggi degli oggetti {@link javax.validation.ConstraintViolation}</td><td>400</td>
31 * </tr>
32 * <tr>
33 * <td>{@link IllegalArgumentException}</td><td>{@link IllegalArgumentException#getMessage()}</td><td>400</td>
34 * </tr>
35 * <tr>
36 * <td>{@link usecase.auth.AuthenticationRequiredException}</td><td>{@link usecase.auth.AuthenticationRequiredException#getMessage()}</td><td>401</td>
37 * </tr>
38 * <tr>
39 * <td>{@link usecase.auth.BannedUserException}</td><td>La durata del ban, contenuta in {@link BannedUserException#getDuration()}</td><td>403</td>
40 * </tr>
41 * <tr>
42 * <td>{@link usecase.auth.AuthorizationException}</td><td>{@link usecase.auth.AuthorizationException#getMessage()}</td><td>403</td>
43 * </tr>
44 * <tr>
45 * <td>{@link RuntimeException}</td><td>{{@link RuntimeException#getMessage()}}</td><td>4500</td>
46 * </tr>
47 * <tr>
48 * <td>{@link javax.servlet.ServletException}</td><td>{{@link javax.servlet.ServletException#getMessage()}}</td><td>500</td>
49 * </tr>
50 * <tr>
51 * <td>{@link java.io.IOException}</td><td>{{@link java.io.IOException#getMessage()}}</td><td>500</td>
52 * </tr>
53 * </table>
54 * @see ForwardOnErrorInterceptor
55 * @see common.http.interceptor.InterceptableServlet
56 * @see common.http.interceptor.ServletInterceptor
57 */
58 @Target({ElementType.METHOD,ElementType.TYPE})
59 @Retention(RetentionPolicy.RUNTIME)
60 public @interface JSONError {
61 }