2017-12-28 26 views
0

Ich versuche, einen Controller zu erstellen, so dass, wenn ein Benutzer zu einer nicht vorhandenen URL geht, er/sie einer benutzerdefinierten Fehlerseite "error.jsp" zugeordnet wird.Spring ExceptionHandlerController zum Erfassen von Fehlern funktioniert nicht

Derzeit sieht mein Exception Handler-Controller wie folgt:

@ControllerAdvice 
public class ExceptionHandlerController { 
    private static final Logger logger = LoggerFactory.getLogger(ExceptionHandlerController.class); 

    @ExceptionHandler(value = {Exception.class, RuntimeException.class}) 
    public String defaultErrorHandler(Exception e) { 
     logger.error("Unhandled exception: ", e); 
     return "error"; 
    } 

    @ExceptionHandler(NoHandlerFoundException.class) 
    public String handle(Exception e) { 
     logger.error("No handler found!", e); 
     return "error"; 
    } 
} 

Allerdings, wenn ich meine Web-Anwendung ausführen und eine nicht vorhandene URL besuchen, ich zum Standard-Browser-Seite weitergeleitet sagen: ‚404 Diese Seite kann nicht sein, Seite.

Hat jemand irgendwelche Gedanken oder Vorschläge, warum das nicht funktioniert?

Antwort

0

Vom JavaDoc von NoHandlerFoundException

standardmäßig, wenn die DispatcherServlet nicht einen Handler für eine Anfrage sendet er eine 404-Antwort finden kann. Wenn jedoch die Eigenschaft "throwExceptionIfNoHandlerFound" auf "true" gesetzt ist, wird diese Ausnahme ausgelöst und kann mit einem konfigurierten HandlerExceptionResolver behandelt werden.

Um dies lösen, müssen Sie sicherstellen, dass Sie haben diese 2 Dinge.

  1. Erstellen SimpleMappingExceptionResolver und Registrierung als Bohne

    @Bean HandlerExceptionResolver customExceptionResolver() { SimpleMappingExceptionResolver s = new SimpleMappingExceptionResolver(); Properties p = new Properties(); //mapping spring internal error NoHandlerFoundException to a view name. p.setProperty(NoHandlerFoundException.class.getName(), "error-page"); s.setExceptionMappings(p); //uncomment following line if we want to send code other than default 200 //s.addStatusCode("error-page", HttpStatus.NOT_FOUND.value());

    //This resolver will be processed before default ones 
        s.setOrder(Ordered.HIGHEST_PRECEDENCE); 
        return s; 
    

    }


  1. Set setThrowExceptionIfNoHandlerFound als wahr in Ihrem DispatcherServlet.

p

public class AppInitializer extends 
     AbstractAnnotationConfigDispatcherServletInitializer { 

    .... 
    ...... 

    @Override 
    protected FrameworkServlet createDispatcherServlet (WebApplicationContext wac) { 
     DispatcherServlet ds = new DispatcherServlet(wac); 
     //setting this flag to true will throw NoHandlerFoundException instead of 404 page 
     ds.setThrowExceptionIfNoHandlerFound(true); 
     return ds; 
    } 

} 

Siehe vollständiges Beispiel here.

+0

Ich habe beides getan und folgte dem Beispiel, das Sie angegeben haben, aber es wird immer noch nicht auf die richtige Fehlerseite abgebildet. – Chadillac

Verwandte Themen