2015-03-06 18 views
6

Vorrei restituire un errore 404 personalizzato utilizzando SpringBoot, ma mi piacerebbe essere in grado di aggiungere qualche logica lato server ad esso, non solo servire una pagina statica.Come si crea un controller 404 utilizzando Spring Boot?

1. Ho spento la pagina di default in whitelabel application.properties

error.whitelabel.enabled=false

2. Ho aggiunto un error.html Thymeleaf sotto resources/templates

Questo funziona per la via. La pagina viene pubblicata, ma nessun controller viene chiamato.

3. Ho creato una classe Error di essere il "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"; 
    } 

} 

Purtroppo, io non sto vedendo Returning Error stampata in qualsiasi parte del console.

Sto utilizzando la Tomcat integrato con la Primavera di avvio. Ho visto varie opzioni, non di quelle che sembrano funzionare incluso l'utilizzo di @ControllerAdvice, la rimozione di RequestMapping, ecc. Non funzionano per me.

risposta

17

Il contenitore servlet raccoglierà il 404 prima che possa arrivare a Spring, quindi sarà necessario definire una pagina di errore a livello del contenitore servlet, che inoltra al controller personalizzato.

@Component 
public class CustomizationBean implements EmbeddedServletContainerCustomizer { 

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

} 
3

Il modo più semplice è stato quello di implementare l'ErrorController.

@Controller 
public class RedirectUnknownUrls implements ErrorController { 

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

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