복붙노트

[SPRING] Spring Boot - 독립 실행 형 바람둥이가있는 사용자 정의 404 페이지

SPRING

Spring Boot - 독립 실행 형 바람둥이가있는 사용자 정의 404 페이지

독립 실행 형 Tomcat 인스턴스에서 Spring 부팅 응용 프로그램을 실행하고 있으며 오류 페이지를 무시하려고합니다. 필자의 이해에서, Spring은 필터 ErrorPageFilter를 제공합니다.이 기능을 사용하면 Springs EmbeddedServletContainerCustomizer가 정상적으로이 오류를 정확하게 처리 할 수 ​​있도록 오류 페이지를 설정할 수 있습니다.

그래서 내 표준 자동 구성 / 서블릿 이니셜 라이저가 한 클래스에 있습니다.

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

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

(자동 구성 및 서블릿 초기화에 동일한 클래스를 사용하고 있는데, 이것이 내가 구성 메소드에서 Application 클래스를 전달한 이유입니다.)

SpringBootServletInitializer의 소스 코드를 보면 ErrorPageFilter 클래스가 여기에 클래스를 확장하여 추가되는 것처럼 보입니다. 나는 ErrorMvcAutoConfiguration을 꺼 놓았지만 - 다시 한번 그 소스 코드를 보면 기본 오류 페이지를 설정하고 실제로 ErrorPageFilter를 설정하지 않은 것처럼 보입니다.

그럼 내 오류 구성 파일을 가지고 :

@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {

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

그러나 잘못된 URL을 방문하고 DispatcherServlet이 일치하는 항목을 찾지 못하면 tomcats /404.html을 볼 수 있습니다 - "/ errors / 404"에 연결된 내보기가 아닙니다 (이 경로는 thymeleaf보기에 매핑되어 있습니다. 템플릿, 잘 작동합니다 - / errors / 404로 이동하면 ok로 표시됩니다)

내 사용자 정의 오류 페이지가 작동하지 않는 이유는 무엇입니까? 로그를 추적 할 때, 나는 ErrorPageFilter가 설정되고 애플리케이션 시작시에 설정이 잘되었음을 알 수있다.하지만 요청이 들어 왔을 때 아무것도하지 않는 필터에 대해서는 언급하지 않았다.

해결법

  1. ==============================

    1.이전 버전의 스프링 부트 (0.5.x)에는 다음 코드를 사용할 수 있습니다.

    이전 버전의 스프링 부트 (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"));
       }
    }
    

    최신 봄 부트 버전 (1.X.RELEASE)에는 ServerProperties를 중심으로 리팩토링이 있습니다. 아래 참조,

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

    그런 다음 Bean을 정의하여 ServerProperies를 주입하십시오.

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

    git에 게시 된 샘플 프로젝트

  2. ==============================

    2.error라는 뷰를 구현하여 스프링 부트의 내장 에러 뷰를 사용하거나, error.whitelabel.enabled = false 속성을 설정하여 뷰의 스위치를 끄고 자신 만의 뷰를 구현할 수 있습니다. 문서에서 더 자세히 설명합니다.

    error라는 뷰를 구현하여 스프링 부트의 내장 에러 뷰를 사용하거나, error.whitelabel.enabled = false 속성을 설정하여 뷰의 스위치를 끄고 자신 만의 뷰를 구현할 수 있습니다. 문서에서 더 자세히 설명합니다.

  3. from https://stackoverflow.com/questions/27386261/spring-boot-custom-404-page-with-standalone-tomcat by cc-by-sa and MIT license