在日常 web 开发中发生了异常,往往需要通过一个统一的 异常处理,来保证客户端能够收到友好的提示。本文将会介绍 Spring Boot 中的 全局统一异常处理。

Springboot的全局异常查是通过两个注解@ControllerAdvice和@ExceptionHandler来实现的。
只有代码出错或者throw出来的异常才会被捕捉处理,如果被catch的异常,就不会被捕捉,除非catch之后再throw异常。

@ControllerAdvice:增强型控制器,对于控制器的全局配置放在同一个位置,全局异常的注解,放在类上。
@ControllerAdvice默认只会处理controller层抛出的异常,如果需要处理service层的异常,需要定义一个自定义的MyException来继承RuntimeException类,然后@ExceptionHandler(MyException)即可。
@ExceptionHandler:指明需要处理的异常类型以及子类。注解放在方法上面。

项目设置

GlobalExceptionHandler.java

package com.dx.controller;

import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice(basePackages = "com.dx.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Map<String, Object> errorResult() {
Map<String, Object> errorResult = new HashMap<String, Object>();
errorResult.put("errorCode", "500");
errorResult.put("errorMsg", "AOP捕获全局异常。");
return errorResult;
} // ⒈全局异常处理返回字符串
@ExceptionHandler(MyPageException.class)
@ResponseBody
public String exception(MyPageException e) {// 未知的异常做出响应
return "MyPageException";
} // ⒉全局异常处理返回JSON
@ExceptionHandler(value = MyJsonException.class)
@ResponseBody
public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyJsonException e) throws Exception {
ErrorInfo<String> r = new ErrorInfo<String>();
r.setMessage(e.getMessage());
r.setCode(ErrorInfo.ERROR);
r.setData("Some Data");
r.setUrl(req.getRequestURL().toString());
return r;
} // ⒊全局异常处理返回JSP
@ExceptionHandler(MyJspException.class)
public String exception(Exception e) {
return "MyJspException";
}
}

ErrorInfo.java

package com.dx.controller;

public class ErrorInfo<T> {
public static final Integer OK = 0;
public static final Integer ERROR = 100;
private Integer code;
private String message;
private String url;
private T data; public Integer getCode() {
return code;
} public void setCode(Integer code) {
this.code = code;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} }

MyJsonException.java

package com.dx.controller;

public class MyJsonException extends Exception {
public MyJsonException(String message) {
super(message);
}
}

MyJspException.java

package com.dx.controller;

public class MyJspException extends Exception {
public MyJspException(String message) {
super(message);
}
}

MyPageException.java

package com.dx.controller;

public class MyPageException extends Exception {
public MyPageException(String message) {
super(message);
}
}

App.java

package com.dx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
} }

测试类:

TestController.java

package com.dx.controller.member;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; import com.dx.controller.MyJsonException;
import com.dx.controller.MyJspException;
import com.dx.controller.MyPageException; @Controller
public class TestController {
@RequestMapping("/json")
public String json() throws MyJsonException {
if (1 == 1)
throw new MyJsonException(""); return "index";
} @RequestMapping("/jsp")
public String jsp() throws MyJspException {
if (1 == 1)
throw new MyJspException(""); return "index";
} @RequestMapping("/page")
public String page() throws MyPageException {
if (1 == 1)
throw new MyPageException(""); return "index";
} @RequestMapping("/common1")
public String common1() throws RuntimeException {
if (1 == 1)
throw new RuntimeException(""); return "index";
} @RequestMapping("/common2")
public String common2() throws Exception {
int i = 2 / 0; return "index";
}
}

测试1 json:

http://localhost:8080/json

测试2 page:

http://localhost:8080/page

测试3 jsp:

http://localhost:8080/jsp

:需要配置一下才能支持jsp

①需要在pom添加JSP的支持

        <!-- 对JSP的解析支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency> <!-- 对JSTL的支持 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>

②需要配置application.properties

在src/main/resources下添加application.properties配置文件,并配置如下内容:

# \u9875\u9762\u9ED8\u8BA4\u524D\u7F00\u76EE\u5F55
spring.mvc.view.prefix=/WEB-INF/
# \u54CD\u5E94\u9875\u9762\u9ED8\u8BA4\u540E\u7F00
spring.mvc.view.suffix=.jsp

③需要添加jsp文件

测试4 common1,common2:

http://localhost:8080/common1

http://localhost:8080/common2

SpringBoot(八):系统错误统一拦截器的更多相关文章

  1. SpringBoot从零单排 ------ 拦截器的使用

    在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...

  2. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  3. 如何在SpringBoot项目中使用拦截器

    相比springmvc,springboot中拦截器不需要在xml中配置,只需定义拦截器类 implements HandlerInterceptor 和拦截器拦截路径的配置类extends WebM ...

  4. springboot中配置了拦截器后,拦截器无效的解决方案之一

    springboot的启动类xxxApplication不能扫描到拦截器配置类,可加上@ComponentScan(basePackages={"com.maya.common"} ...

  5. SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆

    在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...

  6. springBoot 2.X-自定义拦截器

    package com.cx.springboot.myInter; import javax.servlet.http.HttpServletRequest; import javax.servle ...

  7. springboot 2.0+ 自定义拦截器

    之前项目的springboot自定义拦截器使用的是继承WebMvcConfigurerAdapter重写常用方法的方式来实现的. 以下WebMvcConfigurerAdapter 比较常用的重写接口 ...

  8. 玩转SpringBoot之整合Mybatis拦截器对数据库水平分表

    利用Mybatis拦截器对数据库水平分表 需求描述 当数据量比较多时,放在一个表中的时候会影响查询效率:或者数据的时效性只是当月有效的时候:这时我们就会涉及到数据库的分表操作了.当然,你也可以使用比较 ...

  9. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...

随机推荐

  1. wampserver修改端口号后,phpMyAdmin进不去,需要修改相关配置文件

    一.修改Apache端口 1.在界面中选Apache,弹出隐藏菜单选项,打开配置文件httpd.conf: 2.找到 Listen 80: 3.将 80 改成 8080(当然自己也可以设定别的不使用的 ...

  2. VS-常用的快捷键-总结

    1: 快速添加引用 === Shift+Alt+F10; 也可用于实现抽象类 2: 直接添加属性 ===prop+Tab+Tab; 3: 根据字段添加属性 === Ctrl +r+e; 4: 格式化代 ...

  3. StackOverflowError的原因

    package chapter04; /** 如果两个方法出现互相调用的时候会出现StackOverflowError*/ public class C06_Method { public stati ...

  4. CSS3:HSL和HSLA

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 【深度探索C++对象模型 | 02】构造函数语意学

    默认构造函数的构造操作.拷贝构造函数额构造操作  注意:默认构造函数和拷贝构造函数在必要时的时候由编译器产生出来. 参考资料 关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数)

  6. codeforces 758D Ability To Convert【DP】

    在N进制下给你一个数,要你转换成最小的十进制数; 状态转移方程:从前向后 dp[j]表示j位前数列的最小十进制数 dp[j]=min(dp[j],dp[i]*n+x) 程序: #include < ...

  7. What Are You Talking About HDU1075

    一开始我也想用map  但是处理不好其他字符.. 看了题解   多多学习! 很巧妙  就是粗暴的一个字符一个字符的来 分为小写字母和非小写字母两个部分  一但单词结束的时候就开始判断. #includ ...

  8. 《Gradle权威指南》--Android Gradle测试

    No1: Android既可以用传统的JUnit测试,也可以用Android的instrument测试. No2: 当我们运行测试的时候,androidTest SourceSet会被构建成一个可以安 ...

  9. docker容器中安装vim 、telnet、ifconfig, ping命令

    在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim命令时 ...

  10. Linux学习之用户配置文件详解(十四)

    Linux学习之用户配置文件详解 目录 用户信息文件/etc/password 影子文件/etc/shadow 组信息文件/etc/group 组密码文件/etc/gshadow 用户信息文件/etc ...