2015-03-06 9 views
6

Ich möchte einen benutzerdefinierten 404-Fehler mit SpringBoot zurückgeben, aber ich möchte in der Lage sein, einige serverseitige Logik hinzuzufügen, nicht nur eine statische Seite zu bedienen.Wie erstelle ich einen 404-Controller mit Spring Boot?

1. wechselte ich die Standard-White-Label-Seite in application.properties

error.whitelabel.enabled=false

2. Ich habe eine Thymeleaf error.html unter resources/templates

Dies funktioniert durch die Art und Weise ab. Die Seite wird bedient, aber kein Controller wird aufgerufen.

3. Ich habe eine Klasse Error die "Controller"

package com.noxgroup.nitro.pages; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
@RequestMapping("/error") 
public class Error { 

    @ExceptionHandler 
    public String index() { 
     System.out.println("Returning Error"); 
     return "index"; 
    } 

} 

Leider zu sein, ich sehe Returning Error gedruckt überall in der Konsole nicht.

Ich verwende den Embedded Tomcat mit Spring Boot. Ich habe verschiedene Optionen gesehen, von denen keine zu funktionieren scheint, einschließlich der Verwendung von @ControllerAdvice, dem Entfernen von RequestMapping usw. Weder funktionieren für mich.

Antwort

17

Der Servlet-Container wird 404 aufnehmen, bevor er zu Spring gelangen kann. Daher müssen Sie eine Servlets-Container-Fehlerseite definieren, die an Ihren benutzerdefinierten Controller weitergeleitet wird.

@Component 
public class CustomizationBean implements EmbeddedServletContainerCustomizer { 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainer container) { 
    container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error")); 
    } 

} 
3

Am einfachsten fand ich den ErrorController zu implementieren.

@Controller 
public class RedirectUnknownUrls implements ErrorController { 

    @GetMapping("/error") 
    public void redirectNonExistentUrlsToHome(HttpServletResponse response) throws IOException { 
     response.sendRedirect("/"); 
    } 

    @Override 
    public String getErrorPath() { 
     return "/error"; 
    } 
}