2014-12-09 9 views
7

Ich starte eine Spring-Boot-Anwendung in einer eigenständigen Tomcat-Instanz, und ich versuche, die Fehlerseite zu überschreiben. Aus meiner Sicht bietet Spring einen Filter ErrorPageFilter, der es mir ermöglicht, Fehlerseiten wie für Springs EmbeddedServletContainerCustomizer nur so einzurichten, um diesen Fall genau zu behandeln.Spring Boot - benutzerdefinierte 404-Seite mit Standalone-Tomcat

So habe ich meine Standard-Auto-Konfiguration/Servlet-Initialisierung in einer Klasse:

@Configuration 
@ComponentScan 
@EnableAutoConfiguration(exclude = [ GroovyTemplateAutoConfiguration, SecurityAutoConfiguration, ErrorMvcAutoConfiguration, JmxAutoConfiguration ]) 
class Application extends SpringBootServletInitializer { 

    @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     application.sources(Application) 
    } 

(Ich bin die gleiche Klasse für die automatische Konfiguration und Servlet init, weshalb ich gerade meine Application Klasse in der configure übergeben Methode)

Mit Blick auf den Quellcode für SpringBootServletInitializer sieht es aus wie die ErrorPageFilter Klasse wird nur durch die Erweiterung dieser Klasse hier hinzugefügt. Ich habe die ErrorMvcAutoConfiguration ausgeschaltet - aber wieder, mit Blick auf den Quellcode sieht es aus, als ob das nur Standard-Fehlerseiten einstellen und nichts wirklich mit dem ErrorPageFilter einrichten.

ich dann meine Fehler Config-Datei haben:

@Configuration 
class ErrorConfiguration implements EmbeddedServletContainerCustomizer { 

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

Allerdings, wenn ich eine ungültige URL nur besuchen, und ich DispatcherServlet kann keine Übereinstimmung finden dann /404.html bekomme ich nur tomcats - nicht mein Ansicht verknüpft mit "/errors/404" (Ich habe diesen Pfad einer Thymeleflect-Ansichtsvorlage zugeordnet. Das funktioniert einwandfrei. Wenn ich zu/errors/404 navigiere, wird OK angezeigt)

Alle Ideen, warum meine benutzerdefinierte Fehlerseite nicht funktioniert? Verfolgen der Protokolle, bekomme ich eine Zeile über die ErrorPageFilter wird konfiguriert und Setup ok beim Start der Anwendung, aber dann keine Erwähnung des Filters etwas zu tun, wenn eine Anfrage kommt.

+1

Das Beispiel in der Dokumentation ist mit 'EmbeddedServletContainerFactory'. Siehe: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-customizing-configurableembeddedservletcontainerfactory-directly –

+0

Awesome - Ich habe die Dokumente seit Tagen gesucht, nicht sicher, wie ich verpasst das! Habe ich den Punkt der ErrorPageFilter-Klasse dann falsch verstanden?Die Kommentare im Quellcode/javadoc klingen wirklich so, als ob der einzige Zweck dieser Klasse darin besteht, benutzerdefinierte Fehlerseiten in eigenständigen WAR-Implementierungen zuzulassen? – rhinds

Antwort

7

können Sie folgenden Code verwenden, für ältere Versionen von Federverschluß (0.5.x)

public class ServerCustomization extends ServerProperties { 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainerFactory factory) { 

    super.customize(factory); 
    factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, 
      "/yourpath/error-not-found.jsp")); 
    factory.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, 
      "/yourpath/error-internal.jsp")); 
    factory.addErrorPages(new ErrorPage("/yourpath/error-other.jsp")); 
    } 
} 

Neuere Frühjahr Boot-Versionen (1.X.RELEASE) hat einige Refactoring um ServerProperties. Siehe unten,

public class ServerCustomization extends ServerProperties { 

    @Override 
    public void customize(ConfigurableEmbeddedServletContainer container) { 

    super.customize(container); 
    container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, 
      "/jsp/404.jsp")); 
    container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, 
      "/jsp/500.jsp")); 
    container.addErrorPages(new ErrorPage("/jsp/error.jsp")); 
    } 

} 

Definieren Sie anschließend eine Bean, die ServerProperties injiziert.

@Bean 
public ServerProperties getServerProperties() { 
    return new ServerCustomization(); 
} 

Beispielprojekt in git geschrieben

Sehr wichtig: Wenn Sie Maven verwenden zu bauen, Sie speichern müssen alle Ressourcen-Dateien unter src/main/resources Ordner. Andernfalls fügt maven diese Dateien nicht dem endgültigen Jar-Artefakt hinzu.

+0

Ich werde wahrscheinlich mit Evgeni's Antwort in den obigen Kommentar gehen, aber das sieht nach einer guten Lösung aus, so wird dies als akzeptiert markieren. – rhinds

+0

Ok, ich sprach zu bald - keine dieser Lösungen macht einen Unterschied .. andere Ideen? – rhinds

+0

Diese Antwort ist genauso korrekt wie Ihr eigener Versuch ('ServerProperties' ist ein' EmbeddedServletContainerCustomizer'), daher wäre es nützlich, mehr Informationen zu haben (wie ein komplettes Projekt). –

2

Sie können entweder Spring Boot eingebauten Fehlersicht durch Implementieren eine Ansicht namens error, oder schalten Sie sie aus, indem Sie error.whitelabel.enabled=false Eigenschaft festlegen und implementieren Sie Ihre eigenen. Es ist explained more in the docs.

Verwandte Themen