在国外做盗版网站,景德镇市城市建设规划网站,wordpress菜单移动,openshift wordpress 中文❤️ 博客首页#xff1a;水滴技术 #x1f680; 支持水滴#xff1a;点赞#x1f44d; 收藏⭐ 留言#x1f4ac; #x1f338; 订阅专栏#xff1a;Spring 教程#xff1a;从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、… ❤️ 博客首页水滴技术 支持水滴点赞 收藏⭐ 留言 订阅专栏Spring 教程从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、定义“全局异常处理器”2.3、测试热门专栏大家好我是水滴~~
在开发中避免不了要做异常捕获不可能在每段业务代码中进行捕获处理那样代码也太冗余和复杂了。那么如何使用 Spring 处理全局异常呢
1、如何处理全局异常
可以使用 RestControllerAdvice 和 ExceptionHandler 注意进行处理
RestControllerAdvice该注解加到自定义的“全局异常处理类”上表示该类是对 Controller 的增强类可以在该类中实现异常处理了。ExceptionHandler该注解需要加到具体的“异常处理方法”上使用该注解可以指定要处理的异常类型并且“异常处理方法”要返回一个统一的“结果对象”。 RestControllerAdvice 注解实际上就是 ControllerAdvice ResponseBody表示返回的处理结果对象为 JSON 类型。在前后端未分离项目中可以使用 ControllerAdvice 注解用于跳转到异常页面。 2、代码示例
2.1、定义统一的“响应结果对象”
在前后端分离项目中我们通常会自定义一个统一的“响应结果对象”为前端提供统一的响应结果。下面是一个简单的实现代码
public class GlobalResult {/*** 状态码*/private int code;/*** 返回内容*/private String msg;/*** 返回数据*/private Object data;public GlobalResult(int code, String msg) {this.code code;this.msg msg;}public GlobalResult(Object data) {this.code 200;this.msg 成功;this.data data;}public int getCode() {return code;}public void setCode(int code) {this.code code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg msg;}public Object getData() {return data;}public void setData(Object data) {this.data data;}
}2.2、定义“全局异常处理器”
创建一个 GlobalExceptionHandler 类在该类上增加 RestControllerAdvice 注解。自定义一些异常处理方法使用 ExceptionHandler 注解指定具体要处理的异常类型也可以使用 Exception 类来处理所有异常异常处理方法返回上面定义的“全局结果对象”。
import com.example.demo.restful.GlobalResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;RestControllerAdvice
public class GlobalExceptionHandler {private static final Logger log LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 系统异常处理** param e* param request* return*/ExceptionHandler(Exception.class)public GlobalResult handlerException(Exception e, HttpServletRequest request) {log.error(请求地址{}发生系统异常, request.getRequestURI(), e);return new GlobalResult(500, 系统异常);}/*** 算数异常** param e* param request* return*/ExceptionHandler(ArithmeticException.class)public GlobalResult handlerArithmeticException(ArithmeticException e, HttpServletRequest request) {log.error(请求地址{}发生计算异常, request.getRequestURI(), e);return new GlobalResult(500, 计算异常);}
}2.3、测试
添加一个测试的 Controller 类在 RESTFull 方法中故意制造一个异常如下代码
import com.example.demo.restful.GlobalResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RestController
RequestMapping(/test)
public class TestController {GetMapping(/get)public GlobalResult get() {int i 1/0;return new GlobalResult(200, 请求成功);}
}当我们访问该请求时可以看出返回的数据是我们自定义的异常说明已经生效。如下图 热门专栏 《Python入门核心技术》 《IDEA 教程从入门到精通》 《Java 教程从入门到精通》 《MySQL 教程从入门到精通》 《大数据核心技术从入门到精通》