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