Spring Boot: personalizza la pagina di errore di Whitelabel

1. Panoramica

In questo articolo, vedremo come disabilitare e personalizzare la pagina di errore predefinita per un'applicazione Spring Boot poiché una corretta gestione degli errori rappresenta professionalità e lavoro di qualità.

2. Disattivazione della pagina di errore Whitelabel

Per prima cosa, vediamo come possiamo disabilitare completamente la pagina di errore dell'etichetta bianca, impostando la proprietà server.error.whitelabel.enabled su false:

server.error.whitelabel.enabled=false

L'aggiunta di questa voce al file application.properties disabiliterà la pagina di errore e mostrerà una pagina concisa che ha origine dal contenitore dell'applicazione sottostante, ad esempio Tomcat.

Possiamo ottenere lo stesso risultato escludendo il bean ErrorMvcAutoConfiguration . Possiamo farlo aggiungendo questa voce al file delle proprietà:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration #for Spring Boot 2.0 #spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

O aggiungendo questa annotazione alla classe principale:

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})

Tutti i metodi sopra menzionati disabiliteranno la pagina di errore dell'etichetta bianca. Questo ci lascia con la domanda su chi gestisce effettivamente l'errore?

Bene, come accennato in precedenza, di solito è il contenitore dell'applicazione sottostante. La cosa buona è che possiamo personalizzare ulteriormente le cose mostrando le nostre pagine di errore personalizzate invece di tutte le impostazioni predefinite: questo è il fulcro della sezione successiva.

3. Visualizzazione delle pagine di errore personalizzate

Per prima cosa dobbiamo creare una pagina di errore HTML personalizzata.

Salveremo il file come error.html poiché stiamo utilizzando il motore di modelli Thymeleaf :

Our Engineers are on it

Go Home

Se salviamo questo file in resources / templatesdirectory, verrà automaticamente rilevato dal BasicErrorController predefinito di Spring Boot .

Questo è tutto ciò di cui abbiamo bisogno per visualizzare la nostra pagina di errore personalizzata. Con un po 'di stile, ora avremo una pagina di errore molto più carina per i nostri utenti:

Possiamo essere più specifici nominando il file con il codice di stato HTTP che vogliamo che venga utilizzato, ad esempio salvare il file come 404.html in resources / templates / error significa che verrà utilizzato esplicitamente per errori 404.

3.1. Un ErrorController personalizzato

La limitazione finora è che non possiamo eseguire la logica personalizzata quando si verificano errori. Per ottenere ciò, dobbiamo creare un bean del controller di errore che sostituirà quello predefinito.

Per questo, dobbiamo creare una classe che implementa l' interfaccia ErrorController e sovrascrivere il suo metodo getErrorPath () per restituire un percorso personalizzato da chiamare quando si è verificato un errore.

Tuttavia, a partire dalla versione 2.3.x, Spring Boot ha deprecato questo metodo e per specificare il percorso personalizzato dovrebbe essere utilizzata la proprietà server.error.path .

Ma dal momento che fa ancora parte dell'interfaccia ErrorController e non è stato rimosso completamente, dovremo sovrascriverlo altrimenti il ​​compilatore si lamenterà. Per aggirare il problema qui, stiamo restituendo null in quanto verrà comunque ignorato:

@Controller public class MyErrorController implements ErrorController { @RequestMapping("/error") public String handleError() { //do something like logging return "error"; } @Override public String getErrorPath() { return null; } }

Nello snippet sopra, annotiamo anche la classe con @Controller e creiamo una mappatura per il percorso che viene specificato come proprietà server.error.path:

server.error.path=/error

In questo modo il controller può gestire le chiamate al percorso / error .

In handleError () , restituiamo la pagina di errore personalizzata che abbiamo creato in precedenza. Se attiviamo un errore 404 ora, sarà la nostra pagina personalizzata che verrà visualizzata.

Miglioriamo ulteriormente handleError () per visualizzare pagine di errore specifiche per diversi tipi di errore.

Ad esempio, possiamo avere pagine ben progettate specificamente per i tipi di errore 404 e 500. Quindi possiamo utilizzare il codice di stato HTTP dell'errore per determinare una pagina di errore adatta da visualizzare:

@RequestMapping("/error") public String handleError(HttpServletRequest request) { Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (status != null) { Integer statusCode = Integer.valueOf(status.toString()); if(statusCode == HttpStatus.NOT_FOUND.value()) { return "error-404"; } else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { return "error-500"; } } return "error"; }

Quindi, per un errore 404, ad esempio, vedremo la pagina error-404.html :

4. Conclusione

Con queste informazioni, ora possiamo gestire gli errori in modo più elegante e mostrare ai nostri utenti una pagina estetica.

Come sempre, il codice sorgente completo è disponibile su Github.