Jakarta EE Servlet Undtagelse Håndtering

1. Introduktion

I denne vejledning skal vi håndtere undtagelser i en Jakarta EE Servlet-applikation - for at give et yndefuldt og forventet resultat, når der opstår en fejl.

2. Undtagelser fra Jakarta EE Servlet

Først definerer vi en Servlet ved hjælp af API-kommentarerne (se Servlets Intro for flere detaljer) med en standard processor, der kaster en undtagelse:

@WebServlet (urlPatterns = "/ randomError") offentlig klasse RandomErrorServlet udvider HttpServlet {@Override beskyttet ugyldigt doGet (HttpServletRequest req, HttpServletResponse resp) {kast nyt IllegalStateException ("Tilfældig fejl"); }}

3. Standardfejlhåndtering

Lad os nu blot implementere applikationen i vores servletcontainer (vi antager, at applikationen kører under // localhost: 8080 / javax-servlets).

Når vi får adgang til adressen // localhost: 8080 / javax-servlets / randomError, vi ser standard servlet fejlhåndtering på plads:

Standardfejlhåndtering leveres af servletbeholderen og kan tilpasses på et container- eller applikationsniveau.

4. Brugerdefineret fejlhåndtering

Vi kan definere brugerdefineret fejlhåndtering ved hjælp af en web.xml filbeskrivelse, hvor vi kan definere følgende typer politikker:

  • Statuskodefejlhåndtering - det giver os mulighed for at kortlægge HTTP-fejlkoder (klient og server) til en statisk HTML-fejlside eller en fejlhåndteringsservlet
  • Undtagelse type fejlhåndtering - det giver os mulighed for at kortlægge undtagelsestyper til statiske HTML-fejlsider eller en fejlhåndteringsservlet

4.1. Statuskodefejlhåndtering med en HTML-side

Vi kan konfigurere vores brugerdefinerede fejlhåndteringspolitik for HTTP 404-fejl i web.xml:

  404 / fejl-404.html 

Nu, adgang //localhost:8080/javax-servlets/invalid.html fra browseren - for at få den statiske HTML-fejlside.

4.2. Undtagelse Type Fejlhåndtering med en Servlet

Vi kan oprette vores brugerdefinerede fejlhåndteringspolitik for java.lang.Undtagelse i web.xml:

  java.lang.Exception / errorHandler 

I ErrorHandlerServlet, kan vi få adgang til fejloplysningerne ved hjælp af fejlattributterne i anmodningen:

@WebServlet (urlPatterns = "/ errorHandler") offentlig klasse ErrorHandlerServlet udvider HttpServlet {@ Override beskyttet ugyldigt doGet (HttpServletRequest req, HttpServletResponse resp) kaster IOException {resp.setContentType ("text / html; prøv (PrintWriter-skribent = resp.getWriter ()) {writer.write ("Fejlbeskrivelse"); writer.write ("

Fejlbeskrivelse

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

Nu kan vi få adgang // localhost: 8080 / javax-servlets / randomError for at se den tilpassede fejlservlet fungerer.

Bemærk: Vores undtagelsestype defineret i web.xml er for bredt, og vi bør specificere alle de undtagelser, vi ønsker at håndtere mere detaljeret.

Vi kan også bruge den container-leverede servlet-logger i vores ErrorHandlerServlet komponent til at logge yderligere detaljer:

Undtagelsesundtagelse = (Undtagelse) req.getAttribute (ERROR_EXCEPTION); hvis (IllegalArgumentException.class.isInstance (undtagelse)) {getServletContext () .log ("Fejl i et applikationsargument", undtagelse); }

Det er værd at vide, hvad der ligger ud over de servlet-leverede logningsmekanismer, se guiden på slf4j for flere detaljer.

5. Konklusion

I denne korte artikel har vi set standardfejlhåndtering og specificeret brugerdefineret fejlhåndtering i en servletapplikation uden at tilføje eksterne komponenter eller biblioteker.

Som altid kan du finde kildekoden på Servlets tutorial repository.