Manipulação de Exceção de Servlet Java EE
1. Introdução
Neste tutorial, vamos lidar com exceções em um aplicativoJava EE Servlet - para fornecer um resultado normal e esperado sempre que ocorrer um erro.
2. Exceções de Servlet Java EE
Primeiro, vamos definir um Servlet usandoAPI annotations (dê uma olhada emServlets Intro para mais detalhes) com um processadorGET padrão que lançará uma exceção:
@WebServlet(urlPatterns = "/randomError")
public class RandomErrorServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest req,
HttpServletResponse resp) {
throw new IllegalStateException("Random error");
}
}
3. Tratamento de erros padrão
Vamos agora simplesmente implantar o aplicativo em nosso contêiner de servlet (vamos assumir que o aplicativo é executado emhttp://localhost:8080/javax-servlets).
Quando acessarmos o endereçohttp://localhost:8080/javax-servlets/randomError,, veremos o tratamento de erros do servlet padrão em vigor:
O tratamento de erros padrão é fornecido pelo contêiner de servlet e pode ser customizado emcontainer ou nível de aplicativo.
4. Tratamento de erro personalizado
Podemos definir o tratamento de erros personalizado usando um descritor de arquivoweb.xml no qual podemos definir os seguintes tipos de políticas:
-
Status code error handling - nos permite mapear códigos de erro HTTP (clienteserver) para uma página de erro HTML estática ou um servlet de tratamento de erros
-
Exception type error handling - nos permite mapear tipos de exceção para páginas de erro HTML estáticas ou um servlet de tratamento de erros
4.1. Tratamento de erro do código de status com uma página HTML
Podemos configurar nossa política de tratamento de erros personalizada para erros HTTP 404 noweb.xml:
404
/error-404.html
Agora, acessehttp://localhost:8080/javax-servlets/invalid.html do navegador - para obter a página de erro HTML estático.
4.2. Tratamento de erros do tipo de exceção com um servlet
Podemos configurar nossa política de tratamento de erros personalizada parajava.lang.Exception emweb.xml:
java.lang.Exception
/errorHandler
EmErrorHandlerServlet, podemos acessar os detalhes do erro usandoerror attributes fornecido na solicitação:
@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("");
}
}
}
Agora, podemos acessarhttp://localhost:8080/javax-servlets/randomError para ver o servlet de erro personalizado funcionando.
Note: Nosso tipo de exceção definido emweb.xml é muito amplo e devemos especificar todas as exceções que desejamos tratar com mais detalhes.
Também podemos usarcontainer-provided servlet logger em nosso componenteErrorHandlerServlet para registrar detalhes adicionais:
Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION);
if (IllegalArgumentException.class.isInstance(exception)) {
getServletContext()
.log("Error on an application argument", exception);
}
Vale a pena saber o que está além dos mecanismos de registro fornecidos pelo servlet, verifiqueguide on slf4j para obter mais detalhes.
5. Conclusão
Neste breve artigo, vimos o tratamento de erros padrão e o tratamento de erros customizado especificado em um aplicativo de servlet sem incluir componentes externos nem bibliotecas.
Como sempre, você pode encontrar o código-fonte emServlets tutorial repository.