Jakarta EE Servlet Gestione delle eccezioni

1. Introduzione

In questo tutorial, gestiremo le eccezioni in un'applicazione Jakarta EE Servlet, al fine di fornire un risultato gradevole e atteso ogni volta che si verifica un errore.

2. Eccezioni Jakarta EE Servlet

Innanzitutto, definiremo un servlet utilizzando le annotazioni API (dai un'occhiata a Servlet Intro per maggiori dettagli) con un processore GET predefinito che genererà un'eccezione:

@WebServlet(urlPatterns = "/randomError") public class RandomErrorServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) { throw new IllegalStateException("Random error"); } }

3. Gestione degli errori predefinita

Ora distribuiamo semplicemente l'applicazione nel nostro contenitore servlet (supponiamo che l'applicazione venga eseguita in // localhost: 8080 / javax-servlets ).

Quando accediamo all'indirizzo // localhost: 8080 / javax-servlets / randomError , vedremo la gestione degli errori del servlet predefinita in atto:

La gestione degli errori predefinita è fornita dal contenitore servlet e può essere personalizzata a livello di contenitore o applicazione.

4. Gestione degli errori personalizzata

Possiamo definire la gestione degli errori personalizzata utilizzando un descrittore di file web.xml in cui possiamo definire i seguenti tipi di criteri:

  • Gestione degli errori del codice di stato : ci consente di mappare i codici di errore HTTP (client e server) su una pagina di errore HTML statica o su un servlet di gestione degli errori
  • Gestione degli errori del tipo di eccezione : ci consente di mappare i tipi di eccezione a pagine di errore HTML statiche o un servlet di gestione degli errori

4.1. Gestione degli errori del codice di stato con una pagina HTML

Possiamo impostare la nostra politica di gestione degli errori personalizzata per gli errori HTTP 404 nel web.xml :

  404 /error-404.html    

Ora, accedi a //localhost:8080/javax-servlets/invalid.html dal browser, per ottenere la pagina di errore HTML statica.

4.2. Tipo di eccezione Gestione degli errori con un servlet

Possiamo impostare la nostra politica di gestione degli errori personalizzata per java.lang.Exception in web.xml :

  java.lang.Exception /errorHandler  

In ErrorHandlerServlet , possiamo accedere ai dettagli dell'errore utilizzando gli attributi di errore forniti nella richiesta:

@WebServlet(urlPatterns = "/errorHandler") public class ErrorHandlerServlet extends HttpServlet { @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/html; charset=utf-8"); try (PrintWriter writer = resp.getWriter()) { writer.write("Error description"); writer.write("

Error description

"); writer.write("
    "); Arrays.asList( ERROR_STATUS_CODE, ERROR_EXCEPTION_TYPE, ERROR_MESSAGE) .forEach(e -> writer.write("
  • " + e + ":" + req.getAttribute(e) + "
  • ") ); writer.write("
"); writer.write(""); } } }

Ora possiamo accedere a // localhost: 8080 / javax-servlets / randomError per vedere il funzionamento del servlet di errore personalizzato.

Nota : il nostro tipo di eccezione definito in web.xml è troppo ampio e dovremmo specificare tutte le eccezioni che vogliamo gestire in modo più dettagliato.

Possiamo anche utilizzare il servlet logger fornito dal contenitore nel nostro componente ErrorHandlerServlet per registrare ulteriori dettagli:

Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION); if (IllegalArgumentException.class.isInstance(exception)) { getServletContext() .log("Error on an application argument", exception); }

Vale la pena sapere cosa c'è oltre i meccanismi di registrazione forniti dal servlet, controlla la guida su slf4j per maggiori dettagli.

5. conclusione

In questo breve articolo, abbiamo visto la gestione degli errori predefinita e specificato la gestione degli errori personalizzata in un'applicazione servlet senza aggiungere componenti esterni né librerie.

Come sempre, puoi trovare il codice sorgente sul repository dei tutorial di Servlets.