2014-12-09 21 views
7

Używam aplikacji Spring boot wewnątrz autonomicznej instancji tomcat i próbuję przesłonić strony błędów. Z mojego rozumowania Spring dostarcza filtr ErrorPageFilter, który pozwala mi po prostu skonfigurować strony błędów tak, jak zwykle dla Springs EmbeddedServletContainerCustomizer, aby dokładnie obsłużyć tę sprawę.Spring Boot - niestandardowa strona 404 z autonomicznym tomcatem

Więc mam standardowej automatycznej konfiguracji/servlet inicjatora w jednej klasie:

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

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

(używam tej samej klasy dla autokonfiguracji i serwletów init, dlatego też po prostu przekazać moje Application klasę w configure metoda)

Patrząc na kod źródłowy dla SpringBootServletInitializer wygląda na to, że klasa ErrorPageFilter jest dodawana przez rozszerzenie tej klasy tutaj. Wyłączyłem ErrorMvcAutoConfiguration - ale ponownie, patrząc na ten kod źródłowy, wygląda to tak, że po prostu ustawiasz domyślne strony błędów i nie ustawiasz niczego z ErrorPageFilter.

I wtedy mój błąd konfiguracyjny plik:

@Configuration 
class ErrorConfiguration implements EmbeddedServletContainerCustomizer { 

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

Jednakże, jeśli po prostu odwiedzić nieprawidłowy adres URL, a ja nie mogę znaleźć DispatcherServlet mecz potem po prostu kocury /404.html - nie mój widok powiązany z "/errors/404" (Mam tę ścieżkę zmapowaną do szablonu widoku thymeleaf, który działa poprawnie - jeśli nawiguję do/errors/404 to wyświetla się poprawnie)

Jakieś pomysły, dlaczego moja niestandardowa strona błędu nie działa? śledzenie dzienników, otrzymuję komunikat o tym, że ErrorPageFilter jest skonfigurowany i skonfigurowany poprawnie po uruchomieniu aplikacji, ale bez wzmianki o tym, że filtr robi cokolwiek, gdy przychodzi żądanie.

+1

Przykładem w dokumencie jest "EmbeddedServletContainerFactory". Zobacz: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-customizing-configurableembeddedservletcontainerfactory-directly –

+0

Niesamowite - od dawna szukam dokumentów, nie wiem jak tęskniłem! Czy źle zrozumiałem punkt klasy ErrorPageFilter?Komentarze w kodzie źródłowym/javadoc naprawdę brzmią, jakby jedynym celem tej klasy było dopuszczenie niestandardowych stron błędów w samodzielnych wdrożeniach WAR? – rhinds

Odpowiedz

7

Można użyć następujący kod dla starszych wersji bagażnika sprężyny (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")); 
    } 
} 

Nowsze wersje startowe sprężyna (1.X.RELEASE) ma pewne refaktoryzacji wokół ServerProperties. Zobacz poniżej,

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

} 

Następnie zdefiniuj komponent bean, aby wprowadzić parametry ServerProperies.

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

Przykładowy projekt pisał w git

Bardzo ważne: Jeśli używasz maven zbudować, musi przechowywać wszystkie pliki zasobów w folderze src/main/resources. W przeciwnym razie maven nie doda tych plików do ostatecznego artefaktu słoika.

+0

Prawdopodobnie pójdę z odpowiedzią Evgeni w powyższym komentarzu, ale wygląda to również na dobre rozwiązanie, więc oznaczy to jako zaakceptowane. – rhinds

+0

Ok, rozmawiałem już niebawem - żadne z tych rozwiązań nie ma znaczenia ... jakiekolwiek inne pomysły? – rhinds

+0

Ta odpowiedź jest tak samo poprawna jak twoja próba ('ServerProperties' jest' EmbeddedServletContainerCustomizer'), więc byłoby użyteczne mieć więcej informacji (jak pełny projekt). –

2

Możesz użyć wbudowanego widoku błędów Spring Boot poprzez implementację widok o nazwie error lub wyłącz go, ustawiając właściwość error.whitelabel.enabled=false i zaimplementuj własną. Jest to explained more in the docs.