2014-12-09 15 views
7

Sto eseguendo un'applicazione di avvio Spring all'interno di un'istanza di tomcat indipendente e sto tentando di ignorare le pagine di errore. Dalla mia comprensione, Spring fornisce un filtro ErrorPageFilter che mi consente di impostare semplicemente le pagine di errore come normale per le molle EmbeddedServletContainerCustomizer per gestire esattamente questo caso.Spring Boot - pagina 404 personalizzata con tomcat autonomo

così ho il mio standard di inizializzazione automatica di configurazione/servlet in una classe:

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

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

(sto usando la stessa classe per l'autoconfigurazione e servlet init, che è il motivo per cui ho appena passo la mia classe Application nel configure metodo)

Guardando il codice sorgente per SpringBootServletInitializer sembra che la classe ErrorPageFilter venga aggiunta semplicemente estendendo quella classe qui. Ho disattivato lo ErrorMvcAutoConfiguration, ma ancora una volta, guardando a quel codice sorgente, sembra che si stiano semplicemente impostando le pagine di errore predefinite e non impostando effettivamente nulla con lo ErrorPageFilter.

Poi ho il mio errore file di configurazione:

@Configuration 
class ErrorConfiguration implements EmbeddedServletContainerCustomizer { 

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

Tuttavia, se mi basta visitare un URL non valido, e io DispatcherServlet non riesco a trovare una corrispondenza, allora ottengo solo tomcats /404.html - non la mia vista collegata a "/errors/404" (Ho questo percorso mappato a un modello di vista in tilt, che funziona bene - se navigo in/errors/404 visualizza ok)

Qualche idea perché la mia pagina di errore personalizzata non funziona? tracciando i registri, ottengo una riga su ErrorPageFilter configurata e configurata ok all'avvio dell'applicazione, ma poi nessuna menzione del filtro fa nulla quando arriva una richiesta.

+1

L'esempio nei documenti è con 'EmbeddedServletContainerFactory'. Vedi: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-customizing-configurableembeddedservletcontainerfactory-directly –

+0

Impressionante - Ho cercato i documenti per giorni, non sono sicuro di come perso questo! Ho frainteso il punto della classe ErrorPageFilter allora?I commenti nel codice sorgente/javadoc rendono davvero il suono come l'unico scopo di quella classe è quello di consentire pagine di errore personalizzate nelle distribuzioni di WAR standalone? – rhinds

risposta

7

È possibile utilizzare seguente codice per le vecchie versioni di avvio molla (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")); 
    } 
} 

versioni di avvio di primavera più recenti (1.X.RELEASE) ha qualche refactoring intorno ServerProperties. Vedi sotto,

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")); 
    } 

} 

Quindi definire un bean per iniettare ServerProperies.

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

progetto di esempio scritto in git

Molto importante: se si utilizza Maven per costruire, è necessario memorizzare tutti i file di risorse nella cartella src/main/risorse. In caso contrario, Maven non aggiungerà questi file all'oggetto artefatto finale del vaso.

+0

Probabilmente andrò con la risposta di Evgeni nel commento sopra, ma anche questa sembra una buona soluzione, quindi la contrassegnerò come accettata. – rhinds

+0

Ok, ho parlato presto - né queste soluzioni stanno facendo la differenza ... qualche altra idea? – rhinds

+0

Questa risposta è corretta quanto il tuo tentativo ('ServerProperties' è un' EmbeddedServletContainerCustomizer'), quindi sarebbe utile avere più informazioni (come un progetto completo). –

2

È possibile utilizzare la visualizzazione degli errori incorporati di Spring Boot implementando una vista denominata error o disattivarla impostando la proprietà error.whitelabel.enabled=false e implementare la propria. È explained more in the docs.

Problemi correlati