SpringBoot入门(十一)

简介: SpringBoot入门(十一)

SpringBoot-自定义错误页面以及自定义异常的处理

1、自定义错误页面默认读取的静态资源位置:

默认读取的静态资源位置:classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/","classpath:/public/"

写一个controller,代码如下:

  1. package com.boot.exception.demo.bootex.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. @Controller
  5. public class PageController {
  6.    @GetMapping("/e500")
  7.    public String  e500(){
  8.        throw  new RuntimeException("runtime-exception");
  9.    }
  10. }

启动项目运行的结果如下:

当输入一个不存在的路径的话会报404

上面显示的结果是springBoot项目自带给提供的样式。

而当你启动一个springBoot项目的时候,它会有一个默认的错误路径

比如当出现错误的时候,想要给做一个友好的提示的话:

首先看一个类:ResourceProperties,这个类里面定义了一个静态资源路径的classpath,默认的只能读取下面的classpath里的路径的。但是也可以通过配置项的方式去改变这些的路径,但是这样的配置一般在开发中是不怎么会去改变的。

  1. private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

一般的错误页面会分两种:

2、非模板的:

一般非模板的时候把错误页面放到resources下的public文件夹下的:public是一个静态的资源路径,相当于这个路径不会作为访问的一部分。意思是说它直接会从classpath:/public/下面去找,找的时候会把/public/给你加上。因为在springMVC中的映射的/error。所以在public下新建个error的目录,有了它才能够映射下面的处理。

2.1、在error目录下建两个页面,404,500:

2.2、再次重启下项目访问下:

这就是自定义的错误页面,不需要去做任何的配置,它已经做到了这个效果了。

3、模板的:

模板的错误页面默认在resources下的templates文件下的,一样在templates目录下有一个error的文件夹,一样去映射。参看官网看的时候可以看到如果是500的错误,如果是freemarker模板的话:文件的名字可以为5xx.ftl来映射。如果是404的错误的话可以定义文件夹的名字为4xx.ftl来映射。

3.1、现在引入一个thymeleaf的静态模板的依赖:

  1.        <dependency>
  2.            <groupId>org.springframework.boot</groupId>
  3.            <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4.        </dependency>

3.2、在templates/error目录下新建两个thymeleaf的文件:4xx.html,5xx.html:

加入了模板之后,再次运行下项目:



首先它会从静态资源里面去找,如果没有找到再去模板里面去找,这时把public/error改为public/erro1,然后再重新启动下项目访问下:

这时如果在templates目录下有一个明确的文件的时候比如404.html的话,这时如果路径不存在的话会映射到404.html的页面。

然后启动项目访问下:这时找的文件是/templates/error/404.html的文件了。


上面的就是简单的自定义的错误页面,一旦出现错误的话,会从上面的路径去找这些页面的。tomcat定制的时候也可以定制错误页面的。


抛出问题:那么如何去定制如果报404的话就会往404的页面去跳呢?比如说报404或者500的话可以去找这样的错误页面,但是如果想要去定制业务的异常该怎么办呢?

在spring中有一个注解:@ExceptionHandler:用来把这个方法交给异常的框架去处理它。代码如下:

  1.    @ExceptionHandler
  2.    public  String  exPage(Exception ex){
  3.        return "/error/404.html";
  4.    }

这就是不管出现404的错误也好,还是出现500的错误也好,统统会交给这个exPage的方法来处理:测试一波:

我们可以通过上面的方式来去定义它,一般情况下404或者是500,我们有的时候不一定会跳转到这些页面,会有自己的异常处理的页面。比如在做项目的时候:会有对应的业务异常的处理:

1、比如建个BizException的类,代码如下:

  1. package com.boot.exception.demo.bootex.exception;
  2. /**
  3. * 自定义的业务异常
  4. */
  5. public class BizException extends  RuntimeException {
  6.    public BizException() {
  7.        super();
  8.    }
  9.    public BizException(String message) {
  10.        super(message);
  11.    }
  12.    public BizException(String message, Throwable cause) {
  13.        super(message, cause);
  14.    }
  15.    public BizException(Throwable cause) {
  16.        super(cause);
  17.    }
  18.    protected BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
  19.        super(message, cause, enableSuppression, writableStackTrace);
  20.    }
  21. }

2、比如在添加的时候会出现错误了,代码如下:

  1.   @GetMapping("/add")
  2.    public String  add(){
  3.        throw  new BizException("添加出现异常");
  4.    }

3、然后在/templates/error下新建一个biz.html的文件:

在项目开发中一般的出现404异常或者500的异常的话会交给全局的异常来处理,业务异常的话会交给业务异常来处理。在spring4的时候出现了一个注解:@ControllerAdvice。全局处理的异常的注解,代码如下:

  1. package com.boot.exception.demo.bootex.exception;
  2. import org.springframework.web.bind.annotation.ControllerAdvice;
  3. import org.springframework.web.bind.annotation.ExceptionHandler;
  4. @ControllerAdvice
  5. public class GlobalExceptionHandler {
  6.    @ExceptionHandler
  7.    public  String e404(){
  8.        return "error/404.html";
  9.    }
  10.    @ExceptionHandler
  11.    public  String e500(){
  12.        return "error/500.html";
  13.    }
  14. }

然后运行下:这时会报错,但是在springmvc中是不会报错的,在boot中会报错

异常的错误信息:叫做一个状态的异常,没有找到指定的异常解析器。一般的服务器的内部异常是RuntimeException,报404的错误一般是Exception,更改的代码如下:

  1. package com.boot.exception.demo.bootex.exception;
  2. import org.springframework.web.bind.annotation.ControllerAdvice;
  3. import org.springframework.web.bind.annotation.ExceptionHandler;
  4. @ControllerAdvice
  5. public class GlobalExceptionHandler {
  6.    @ExceptionHandler(Exception.class)
  7.    public  String e404(){
  8.        return "error/404.html";
  9.    }
  10.    @ExceptionHandler(RuntimeException.class)
  11.    public  String e500(){
  12.        return "error/500.html";
  13.    }
  14. }

而在pageController做的局部的业务异常,更改的代码如下:

  1. package com.boot.exception.demo.bootex.controller;
  2. import com.boot.exception.demo.bootex.exception.BizException;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.ExceptionHandler;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. @Controller
  7. public class PageController {
  8.    @GetMapping("/e500")
  9.    public String  e500(){
  10.        throw  new RuntimeException("runtime-exception");
  11.    }
  12.    @ExceptionHandler(BizException.class)
  13.    public  String  exPage(Exception ex){
  14.        return "/error/biz.html";
  15.    }
  16.    @GetMapping("/add")
  17.    public String  add(){
  18.        throw  new BizException("添加出现异常");
  19.    }
  20. }

测试下:

也可以在方法指定具体的状态码:这里可以指定各种状态的异常就比较细化了。

总结,这时异常处理的思路就清晰了。限制业务异常只能处理自己的异常,只能在本模块里处理自己的异常,而其他的异常统统的交给全局异常来处理。上面的就是自定义的异常和自定义处理的页面的思路,一般的业务异常会继承RuntimeException,系统的系统会继承Exception,框架的构建的异常可能会继承Exception,但是很多的时候抛出的时候是Exception,但是捕获的时候是自定义的异常。

相关文章
|
移动开发 Java HTML5
Springboot web静态资源配置
Springboot web静态资源配置
1446 0
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3186 1
|
JSON IDE Java
20 款 IDEA 主题任你选!(快来看看你最喜欢那个~)
我是小假 期待与你的下一次相遇 ~
5898 1
|
缓存 负载均衡 应用服务中间件
Nginx
Nginx 以其卓越的性能、稳定性和灵活性,成为现代网络架构中不可或缺的一部分。通过合理配置和优化,它能够为各种应用提供高效、可靠的服务支持。同时,随着技术的不断发展,Nginx 也在不断演进和完善,以适应日益复杂的网络环境和需求。无论是在传统的 Web 应用还是新兴的云计算、微服务架构中,Nginx 都将继续发挥重要作用。
693 157
|
Java Spring
Spring Boot入门(二十五) 之 错误页面的定制
Spring Boot入门(二十五) 之 错误页面的定制
211 0
echarts的xAxis和yAxis——x轴y轴以及网格线的详细配置
echarts的xAxis和yAxis——x轴y轴以及网格线的详细配置
7325 0
|
JavaScript 前端开发 Java
SpringBoot配置文件 —— 超详细全方位教程
本文是一篇关于SpringBoot配置文件的超详细全方位教程,涵盖了配置文件的作用、SpringBoot中的配置文件格式、优先级、properties和yml配置文件的详解及语法、读取配置文件的方法、转义字符和单双引号的使用、配置对象、集合和Map,以及yml的优缺点。
2054 0
SpringBoot配置文件 —— 超详细全方位教程
|
监控 Java Spring
SpringBoot的入门(四)
SpringBoot的入门(四)
|
Java
SpringBoot自定义错误页面与原理讲解
SpringBoot自定义错误页面与原理讲解
958 0
|
NoSQL Java Redis
SpringBoot的入门(一)
SpringBoot的入门(一)