java servlets web.xml custom-error-pages

La etiqueta<error-page> en web.xml no captura excepciones java.lang.Throwable



servlets custom-error-pages (2)

Tengo hoy el mismo problema. (JavaEE 7 y Glassfish 4.0)

El problema parece que el marco lo verifica como String en lugar de Class.

Verificación basada en cadenas (la hipótesis)

Cuando se produce una excepción, e.getClass() se compara con <exception-type> como cadena. Entonces no puedes usar herencia.

Tenga en cuenta que las clases anidadas deben señalarse como ''$'' en lugar de ''.'' (igual que el método getClass ()).

Cheque basado en clase

El marco crea una instancia de la clase, y el texto <exception-type> refiere a él, y class.isInstance() se usa para verificar.

Esto necesitará una reflexión y un archivo de política podría romperlo.

Espero que esta respuesta resuelva los problemas futuros.

Tengo una aplicación web desarrollada con servlet y JSP. Configuré mi aplicación para arrojar una IllegalArgumentException si inserto parámetros incorrectos. Luego configuré mi archivo web.xml de esta manera:

<error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error.jsp</location> </error-page>

Cuando me error.jsp un 404 error , funciona y llama a error.jsp , pero cuando error.jsp una java.lang.IllegalArgumentException , no funciona y tengo una blank page en blank page lugar de error.jsp . ¿Por qué?

El servidor es Glassfish, y los registros muestran realmente IllegalArgumentException rised.


No debes atraparlo ni suprimirlo, solo déjalo ir.

Es decir, no:

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { doSomethingWhichMayThrowException(); } catch (IllegalArgumentException e) { e.printStackTrace(); // Or something else which totally suppresses the exception. } }

Pero mejor déjalo ir:

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doSomethingWhichMayThrowException(); }

O bien, si en realidad tiene la intención de atraparlo para el registro o así (prefiero usar un filtro para eso, pero ala), vuelva a lanzarlo:

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { doSomethingWhichMayThrowException(); } catch (IllegalArgumentException e) { e.printStackTrace(); throw e; } }

O bien, si no se trata de una excepción de tiempo de ejecución, ServletException a ServletException empaquetada en ServletException , será ServletException automáticamente por el contenedor:

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { doSomethingWhichMayThrowException(); } catch (NotARuntimeException e) { throw new ServletException(e); } }

Ver también: