Páginas de erro personalizadas com o Spring MVC
1. Visão geral
Um requisito comum em qualquer aplicativo da Web são páginas de erro personalizadas.
Por exemplo, suponha que você esteja executando um aplicativo Spring MVC vanilla em cima do Tomcat. Um usuário digita um URL inválido no navegador e é mostrado um rastreamento de pilha azul e branco não tão amigável - não é o ideal.
Neste tutorial, configuraremos páginas de erro personalizadas para alguns códigos de erro HTTP.
A suposição de trabalho é que o leitor está bastante confortável trabalhando com Spring MVC; caso contrário,this is a great way to start.
2. Os passos simples
Vamos começar com as etapas simples que vamos seguir aqui:
-
Especifique um único URL/errors emweb.xml que mapeia para um método que trataria do erro sempre que um erro for gerado
-
Crie um controlador chamadoErrorController com um mapeamento/errors
-
Descubra o código de erro HTTP em tempo de execução e exiba uma mensagem de acordo com o código de erro HTTP.. Por exemplo, se um erro 404 for gerado, o usuário deverá ver uma mensagem como‘Resource not found' , enquanto para 500 erro, o usuário deve ver algo nas linhas de‘Sorry! An Internal Server Error was generated at our end'
3. Oweb.xml
Começamos adicionando as seguintes linhas ao nossoweb.xml:
/errors
Observe que esse recurso está disponível apenas nas versões Servlet maiores que 3.0.
Qualquer erro gerado em um aplicativo está associado a um código de erro HTTP. Por exemplo, suponha que um usuário insira uma URL/invalidUrl no navegador, mas nenhumaRequestMapping foi definida dentro do Spring. Em seguida, um código HTTP 404 gerado pelo servidor da Web subjacente. As linhas que acabamos de adicionar ao nossoweb.xml dizem ao Spring para executar a lógica escrita no método que é mapeado para a URL/errors.
Uma observação rápida aqui - a configuração do Java Servlet correspondente, infelizmente, não tem uma API para configurar a página de erro - então, neste caso, realmente precisamos doweb.xml.
4. O controlador
Continuando, agora criamos nossoErrorController. Criamos um único método unificador que intercepta o erro e exibe uma página de erro:
@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. O Front-End
Para fins de demonstração, manteremos nossa página de erro muito simples e compacta. Esta página conterá apenas uma mensagem exibida em uma tela branca. Crie um arquivojsp chamadoerrorPage.jsp :
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
Home
${errorMsg}
6. Teste
Simularemos dois dos erros mais comuns que ocorrem em qualquer aplicativo: o erro HTTP 404 e o erro HTTP 500.
Execute o servidor e vá paralocalhost:8080/spring-mvc-xml/invalidUrl.Como este URL não existe, esperamos ver nossa página de erro com a mensagem ‘Http Error Code : 404. Resource not found'.
Vamos ver o que acontece quando um dos métodos manipuladores lança umNullPointerException.. Adicionamos o seguinte método aErrorController:
@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
throw new NullPointerException("Throwing a null pointer exception");
}
Vá paralocalhost:8080/spring-mvc-xml/500Error. Você deve ver uma tela branca com a mensagem ‘Código de erro Http: 500. Erro do Servidor Interno'.
7. Conclusão
Vimos como configurar páginas de erro para diferentes códigos HTTP com Spring MVC. Criamos uma única página de erro onde uma mensagem de erro é exibida dinamicamente de acordo com o código de erro HTTP.