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 }