View Javadoc
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  }