복붙노트

[SPRING] 봄 부팅 및 맞춤 404 오류 페이지

SPRING

봄 부팅 및 맞춤 404 오류 페이지

Spring Boot 애플리케이션에서 사용자 정의 오류 페이지를 구성하려고합니다. 예를 들어 404의 경우 다음 Bean을 내 애플리케이션 구성에 추가했습니다.

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return new EmbeddedServletContainerCustomizer() {
        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
        }
    };
}

또한 다음 간단한 Thymeleaf 템플릿을 만들었습니다.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>404 Not Found</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <h3>404 Not Found</h3>
        <h1 th:text="${errorCode}">404</h1>
        <p th:utext="${errorMessage}">Error java.lang.NullPointerException</p>
        <a href="/" th:href="@{/}">Back to Home Page</a>
    </body>
</html>

/ resources / templates / 폴더에 추가했습니다. 404 오류가 발생하면 흰색 화면 만 볼 수 있습니다.

내가 뭘 잘못하고 내 404 페이지를 올바르게 설정하는 방법? 또한 사용자 정의 오류 페이지에 정적 페이지가 아닌 템플릿을 사용할 수 있습니까?

해결법

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

    1.Spring Boot 1.4.x에서는 다음과 같이 사용자 정의 오류 페이지를 추가 할 수 있습니다.

    Spring Boot 1.4.x에서는 다음과 같이 사용자 정의 오류 페이지를 추가 할 수 있습니다.

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

    2.Thymeleaf를 사용 중이며 Thymeleaf는 컨트롤러없이 오류를 처리 할 수 ​​있습니다.

    Thymeleaf를 사용 중이며 Thymeleaf는 컨트롤러없이 오류를 처리 할 수 ​​있습니다.

    일반 오류 페이지의 경우이 Thymeleaf 페이지의 이름을 error.html로 지정해야합니다. src / main / resources> templates> error.html 아래에 위치해야합니다.

    특정 오류 페이지의 경우 http 오류 코드로 이름 지정된 파일을 src / main / resources / templates / error / 404.html과 같은 error 폴더에 만들어야합니다.

  3. ==============================

    3./404.html은 템플릿 이름이 아닌 리디렉션 할 URL 경로를 나타냅니다. 템플릿을 사용하기를 원한다면 /404.html을 처리하고 404.html을 src / main / resources / templates에 렌더링하는 컨트롤러를 만들어야합니다.

    /404.html은 템플릿 이름이 아닌 리디렉션 할 URL 경로를 나타냅니다. 템플릿을 사용하기를 원한다면 /404.html을 처리하고 404.html을 src / main / resources / templates에 렌더링하는 컨트롤러를 만들어야합니다.

    @Controller
    public class NotFoundController {
        @RequestMapping("/404.html")
        public String render404(Model model) {
            // Add model attributes
            return "404";
        }
    }
    

    View Controller로 렌더러 컨트롤러를 바꿀 수도 있습니다.

    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/404.html").setViewName("404");
        }
    }
    

    예, 가능합니다. 그러나 발견되지 않은 페이지는 일반적으로 정적이며 일반 텍스트 대신 서식 파일을 사용합니다. 오래된 HTML은 그다지 의미가 없습니다.

  4. ==============================

    4.질문에서 제안한 것과 같이 Thymeleaf를 사용하는 경우 이전 응답의 것과 유사한 템플리트를 사용할 수 있지만 Freemarker가 아닌 Thymeleaf에 적합합니다. 나는 또한 스타일링을위한 부트 스트랩을 추가했다.

    질문에서 제안한 것과 같이 Thymeleaf를 사용하는 경우 이전 응답의 것과 유사한 템플리트를 사용할 수 있지만 Freemarker가 아닌 Thymeleaf에 적합합니다. 나는 또한 스타일링을위한 부트 스트랩을 추가했다.

    <!DOCTYPE html>
    <html lang="en"
          xmlns:th="http://www.thymeleaf.org">
    <head>
    <title>Error Page</title>
    <link href="/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" rel="stylesheet" media="screen"/>
    <script src="/webjars/jquery/3.2.1/jquery.min.js"></script>
    <script src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container">
    <div class="jumbotron alert-danger">
        <h1>Oops... something went wrong.</h1>
        <h2 th:text="${status + ' ' + error}"></h2>
    </div>
    </div>
    </body>
    </html>
    

    이 코드를 error.html이라는 파일에 넣고 thymeleaf templates 디렉토리에 넣어야합니다. 작동시키기 위해 컨트롤러를 추가 할 필요가 없습니다.

  5. ==============================

    5.EmbeddedServletContainerCustomizer 빈은 필요하지 않습니다. 공용 디렉토리에 해당 오류 페이지 (404의 경우 404.html 등)를 넣기 만하면됩니다 (@brunoid가 가리키는 것처럼).

    EmbeddedServletContainerCustomizer 빈은 필요하지 않습니다. 공용 디렉토리에 해당 오류 페이지 (404의 경우 404.html 등)를 넣기 만하면됩니다 (@brunoid가 가리키는 것처럼).

    또한 응용 프로그램에 오류나 예외가 발생할 때마다 표시되는 일반 error.html 페이지를 삽입 할 수도 있습니다.

    간단한 예 (Freemarker에서) -

    <html lang="en">
    <head>
    </head>
    <body>
        <div class="container">
            <div class="jumbotron alert-danger">
                <h1>Oops. Something went wrong</h1>
                <h2>${status} ${error}</h2>
            </div>
        </div>
    </body>
    
    </html>
    

    그러면 적절한 오류 상태와 해당 오류 메시지가 표시됩니다. Spring Boot를 사용하고 있기 때문에 오류 페이지에 표시되는 상태 및 오류 메시지를 항상 무시할 수 있습니다.

  6. ==============================

    6.Thymeleaf는 컨트롤러없이 오류를 처리 할 수 ​​있습니다. 리소스 폴더에 error.html을 작성하십시오.

    Thymeleaf는 컨트롤러없이 오류를 처리 할 수 ​​있습니다. 리소스 폴더에 error.html을 작성하십시오.

  7. ==============================

    7.우리는 새로운 것을 추가해야한다.

    우리는 새로운 것을 추가해야한다.

     @Controller
    public class MyErrorController implements ErrorController  {
    
        @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
    
        if (status != null) {
            Integer statusCode = Integer.valueOf(status.toString());
    
            if(statusCode == HttpStatus.NOT_FOUND.value()) {
                return "error404";
            }
            else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
                return "error500";
            }
        }
        return "error";
    }
    
        @Override
        public String getErrorPath() {
            return "/error";
        }
    }
    
  8. from https://stackoverflow.com/questions/37398385/spring-boot-and-custom-404-error-page by cc-by-sa and MIT license