【问题标题】:Customized 404 error page in spring-bootspring-boot中自定义的404错误页面
【发布时间】:2017-08-07 17:04:38
【问题描述】:

我正在尝试为 SpringMvc(Spring-boot 版本 1.5.1)中的无效 URL 创建自定义错误页面。

为了禁用默认的白标签错误页面,我有:

application.properties

spring.thymeleaf.cache=false
server.error.whitelabel.enabled=false
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

我的异常处理程序是:

RestResponseEntityExceptionHandler.java

@ControllerAdvice 
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    public RestResponseEntityExceptionHandler() {
        super();
    }

    @Override
    protected ResponseEntity<Object> handleNoHandlerFoundException(NoHandlerFoundException ex,
        HttpHeaders headers, HttpStatus status, WebRequest request) {
        logger.error("404 Status Code", ex);
        final GenericResponse bodyOfResponse = new GenericResponse(messages.getMessage("No such page", null, request.getLocale()), "NoHandlerFound");
        return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.NOT_FOUND, request);
    }
}

这原则上是可行的。如果我在浏览器中访问一个无效的 URL,我会得到一个如下所示的 JSON:

{"message":"没有这样的页面","error":"NoHandlerFound"}

我想显示一个正确的 HTML 视图(类似于 whitelabel 页面),而不是 JSON 响应。这应该是一个模板,我可以在其中替换“消息”字符串。我该如何渲染这个视图?

【问题讨论】:

    标签: spring-mvc model-view-controller spring-boot exception-handling


    【解决方案1】:

    使用 Spring Boot 和 Spring MVC,您可以在 resources/public 下创建一个错误文件夹并放置您的客户错误页面。春天会把它们捡起来。

    src/
    +- main/
       +- java/
       |   + <source code>
       +- resources/
           +- public/
               +- error/
               |   +- 404.html
               +- <other public assets>
    

    如果您不使用 Spring MVC,则必须通过实现自己的错误页面注册器来注册错误页面。

    @Bean
    public ErrorPageRegistrar errorPageRegistrar(){
        return new MyErrorPageRegistrar();
    }
    
    private static class MyErrorPageRegistrar implements ErrorPageRegistrar {
    
        // Register your error pages and url paths.
        @Override
        public void registerErrorPages(ErrorPageRegistry registry) {
            registry.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400"));
        }
    
    }
    

    http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-error-handling-custom-error-pages

    【讨论】:

    • 我将 Spring MVC 与 thymeleaf 一起使用,并尝试将 error.html 和 404.html 页面放在 /resources/public/error/ 中 /resources/templates 和 /resources/templates/error/ 中,但是显然他们找不到。还需要其他什么来完成这项工作吗?
    • 从您的属性文件中删除 server.error.whitelabel.enabled=false。
    • 那行得通。现在我只需要弄清楚如何将请求 url 放入视图中。
    猜你喜欢
    • 2014-11-30
    • 2018-02-11
    • 1970-01-01
    • 2016-04-25
    • 2013-09-16
    • 2020-10-24
    • 2017-10-06
    • 2015-09-04
    • 2015-02-07
    相关资源
    最近更新 更多