Spring Boot自定义错误转发页面

作者: 乐傻驴 | 来源:发表于2017-09-24 20:08 被阅读637次

    引言

            没有完美的程序,只有不断的追求完美,我们才能进步和成长,程序的运行不可能是一帆风顺的,当出现一些错误时,比如500服务器内部错误,404用户访问错误的URL,405用户无此权限........针对这些问题Spring Boot给我们提供了一些错误的信息页面提示。

    Spring Boot提供的404错误页面

            作为开发人员我们一眼就能看懂,但是如果给用户看这种页面,不知情的用户还以为我们的系统怎么了,造成用户体验度非常不好,针对这些问题我们应该给用户友好的提示,一般我们都需要定制一些错误的页面。

    自定义错误页面:

    1.静态资源的方式:

            1.在resources目录下创建public/error目录,编写错误页面。

    创建public/error目录,编写错误页面

    2.访问测试:

    2.动态方式:

    1.使用IDEA建立一个Spring Boot项目,在pom.xml文件中添加和配置如下内容:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    

    2.在src/main/下创建webapp/view/error/目录,并在下面定义错误页面:

    创建目录并定义错误页面

    3.在application.yml文件中配置Spring MVC视图解析器:

    配置Spring MVC视图解析器

    4.编写ErrorConfiguration配置类:

    (1)编写代码之间我们先普及一下小知识:
            我们使用基于java容器配置的方式,在Spring 3.0中引入了基于java容器的配置,SpringJava容器配置支持中的中心工件是 @Configuration注解用于注释类和@Bean 用于注释方法,对于熟悉SpringXML配置中<beans/>配置的开发人员,@Bean注释与<bean/>元素的作用相同。
            EmbeddedServletContainerCustomizer接口可以自定义嵌入式servlet容器的策略界面。这种类型的bean将在容器本身启动之前与容器工厂进行回调,因此我们可以设置端口,地址,错误页面等。
            通过查看API发现此接口只有一个方法customize,此方法需要传递ConfigurableEmeddedServletContainer的实现类对象。

            ConfigurableEmeddedServletContainer是一个接口,阅读API文档得知此接口继承了ErrorPageRegistry接口。

            阅读API文档得知ErrorPageRegistry接口中只有一个addErrorPage方法,此方法需要传递ErrorPage对象。

            阅读API文档得知ErrorPage类表示简单和容器无关的servlet错误页面抽象,此类相当于web.xml中的<error-page>,ErrorPage提供了三种构造方法,我们只使用public ErrorPage(org.springframework.http.HttpStatus status,String path)构造,指出一个错误类型(org.springframework.http.HttpStatus是一个枚举类型,里面提供了http状态码
    ),并传递一个错误呈现的路径即可。

    ErrorPage类中三个构造中其中一个也就是我们要使用的那个

    (2)知识普及完了开始编写编写ErrorConfiguration配置类:

    @Configuration
    public class ErrorConfiguration {
        @Bean
        public EmbeddedServletContainerCustomizer containerCustomizer() {
            return new EmbeddedServletContainerCustomizer(){
                @Override
                public void customize(ConfigurableEmbeddedServletContainer container) {
                    container.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400.html"));
                    container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404.html"));      
                    container.addErrorPages(newErrorPage(HttpStatus.METHOD_NOT_ALLOWED,"/error/405.html"));
                    container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500.html"));  
                }
            };
        }
    

    5.编写ErrorController前端控制器:

    (1)脑补一下:
            Spring4.3中引进了@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping,来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。
            @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写,该注解将http get请求映射到特定的处理方法上,其余的那几个大家举一反三也就明白了吧。

    (2)编写代码:

    @Controller
    @RequestMapping(value = "error")
    public class ErrorController {
    /**
     * 配置400错误转发
     * @return
     */
    @GetMapping(value = "400.html")
    public String badequest() {
        return "error/400";
    }
    /**
     * 配置404错误转发
     * @return
     */
    @GetMapping(value = "404.html")
    public String notFound() {
        return "error/404";
    }
    /**
     * 配置405错误转发
     * @return
     */
    @GetMapping(value = "405.html")
    public String merthodNotAllowed() {
        return "error/405";
    }
    /**
     * 配置500错误转发
     * @return
     */
    @GetMapping(value = "500.html")
    public String serverError() {
        return "error/500";
     }
    }
    

    6.访问测试:

    总结

            这两种方式我这里都进行了配置,我想证明一下两种方式如果同时存将会使用哪种方式呢,通过实践证明,当静态资源配置和动态配置同时存在时动态资源配置生效。

    相关文章

      网友评论

        本文标题:Spring Boot自定义错误转发页面

        本文链接:https://www.haomeiwen.com/subject/obgkextx.html