@ -71,6 +71,8 @@ class ErrorPageFilter extends AbstractConfigurableEmbeddedServletContainer imple
@@ -71,6 +71,8 @@ class ErrorPageFilter extends AbstractConfigurableEmbeddedServletContainer imple
private final Map < Class < ? > , String > exceptions = new HashMap < Class < ? > , String > ( ) ;
private final Map < Class < ? > , Class < ? > > subtypes = new HashMap < Class < ? > , Class < ? > > ( ) ;
@Override
public void init ( FilterConfig filterConfig ) throws ServletException {
}
@ -118,14 +120,34 @@ class ErrorPageFilter extends AbstractConfigurableEmbeddedServletContainer imple
@@ -118,14 +120,34 @@ class ErrorPageFilter extends AbstractConfigurableEmbeddedServletContainer imple
private void handleException ( HttpServletRequest request ,
HttpServletResponse response , ErrorWrapperResponse wrapped , Throwable ex )
throws IOException , ServletException {
String errorPath = getErrorPath ( this . exceptions , ex . getClass ( ) ) ;
Class < ? > type = ex . getClass ( ) ;
String errorPath = this . global ;
if ( this . exceptions . containsKey ( type ) ) {
errorPath = this . exceptions . get ( type ) ;
}
else {
if ( this . subtypes . containsKey ( type ) ) {
errorPath = this . exceptions . get ( this . subtypes . get ( type ) ) ;
}
else {
Class < ? > subtype = type ;
while ( subtype ! = Object . class ) {
subtype = subtype . getSuperclass ( ) ;
if ( this . exceptions . containsKey ( subtype ) ) {
this . subtypes . put ( subtype , type ) ;
errorPath = this . exceptions . get ( subtype ) ;
break ;
}
}
}
}
if ( errorPath = = null ) {
rethrow ( ex ) ;
return ;
}
setErrorAttributes ( request , 500 , ex . getMessage ( ) ) ;
request . setAttribute ( ERROR_EXCEPTION , ex ) ;
request . setAttribute ( ERROR_EXCEPTION_TYPE , ex . getClass ( ) . getName ( ) ) ;
request . setAttribute ( ERROR_EXCEPTION_TYPE , type . getName ( ) ) ;
wrapped . sendError ( 500 , ex . getMessage ( ) ) ;
request . getRequestDispatcher ( errorPath ) . forward ( request , response ) ;
}