Pagine di errore personalizzate con Spring MVC

1. Panoramica

Un requisito comune in qualsiasi applicazione Web sono le pagine di errore personalizzate.

Ad esempio, supponi di eseguire un'app Vanilla Spring MVC su Tomcat. Un utente inserisce un URL non valido nel suo browser e viene mostrata una traccia dello stack blu e bianca non così user-friendly - non è l'ideale.

In questo tutorial, configureremo pagine di errore personalizzate per alcuni codici di errore HTTP.

Il presupposto di lavoro è che il lettore sia abbastanza a suo agio a lavorare con Spring MVC; in caso contrario, questo è un ottimo modo per iniziare.

Questo articolo si concentra su Spring MVC. Il nostro articolo Personalizza pagina di errore Whitelabel descrive come creare una pagina di errore personalizzata in Spring Boot.

2. I semplici passaggi

Cominciamo con i semplici passaggi che seguiremo qui:

  1. Specificare un singolo URL / errori in web.xml che esegue il mapping a un metodo che gestirà l'errore ogni volta che viene generato un errore
  2. Crea un controller chiamato ErrorController con una mappatura / errori
  3. Individua il codice di errore HTTP in fase di esecuzione e visualizza un messaggio in base al codice di errore HTTP . Ad esempio, se viene generato un errore 404, l'utente dovrebbe vedere un messaggio come "Risorsa non trovata", mentre per un errore 500, l'utente dovrebbe vedere qualcosa sulla riga di "Spiacente! Da parte nostra è stato generato un errore interno del server "

3. Il file web.xml

Iniziamo aggiungendo le seguenti righe al nostro web.xml :

 /errors 

Notare che questa funzione è disponibile solo nelle versioni Servlet maggiori di 3.0.

Qualsiasi errore generato all'interno di un'app è associato a un codice di errore HTTP. Ad esempio, supponiamo che un utente immetta un URL / invalidUrl nel browser, ma nessun RequestMapping di questo tipo è stato definito all'interno di Spring. Quindi, un codice HTTP di 404 generato dal server web sottostante. Le righe che abbiamo appena aggiunto al nostro web.xml dicono a Spring di eseguire la logica scritta nel metodo mappato all'URL / errors.

Una breve nota a margine qui: la configurazione del servlet Java corrispondente non ha purtroppo un'API per l'impostazione della pagina di errore - quindi in questo caso, abbiamo effettivamente bisogno di web.xml .

4. Il Titolare

Andando avanti, ora creiamo il nostro ErrorController . Creiamo un unico metodo unificante che intercetta l'errore e visualizza una pagina di errore:

@Controller public class ErrorController { @RequestMapping(value = "errors", method = RequestMethod.GET) public ModelAndView renderErrorPage(HttpServletRequest httpRequest) { ModelAndView errorPage = new ModelAndView("errorPage"); String errorMsg = ""; int httpErrorCode = getErrorCode(httpRequest); switch (httpErrorCode) { case 400: { errorMsg = "Http Error Code: 400. Bad Request"; break; } case 401: { errorMsg = "Http Error Code: 401. Unauthorized"; break; } case 404: { errorMsg = "Http Error Code: 404. Resource not found"; break; } case 500: { errorMsg = "Http Error Code: 500. Internal Server Error"; break; } } errorPage.addObject("errorMsg", errorMsg); return errorPage; } private int getErrorCode(HttpServletRequest httpRequest) { return (Integer) httpRequest .getAttribute("javax.servlet.error.status_code"); } } 

5. Il front-end

A scopo dimostrativo, manterremo la nostra pagina di errore molto semplice e compatta. Questa pagina conterrà solo un messaggio visualizzato su uno schermo bianco. Crea un file jsp chiamato errorPage.jsp:

 Home 

6. Test

Simuleremo due degli errori più comuni che si verificano in qualsiasi applicazione: l'errore HTTP 404 e l'errore HTTP 500.

Esegui il server e vai su localhost: 8080 / spring-mvc-xml / invalidUrl. Poiché questo URL non esiste, ci aspettiamo di vedere la nostra pagina di errore con il messaggio " Codice di errore HTTP: 404. Risorsa non trovata".

Vediamo cosa succede quando uno dei metodi del gestore genera una NullPointerException. Aggiungiamo il seguente metodo a ErrorController:

@RequestMapping(value = "500Error", method = RequestMethod.GET) public void throwRuntimeException() { throw new NullPointerException("Throwing a null pointer exception"); }

Vai su localhost: 8080 / spring-mvc-xml / 500Error. Dovresti vedere una schermata bianca con il messaggio "Http Error Code: 500. Internal Server Error".

7. Conclusione

Abbiamo visto come impostare pagine di errore per diversi codici HTTP con Spring MVC . Abbiamo creato una singola pagina di errore in cui un messaggio di errore viene visualizzato dinamicamente in base al codice di errore HTTP.