统一异常处理原理是,系统中出现的所有异常都往外抛,最终用一个异常处理类统一捕获处理。
Service层有异常(可以是用户自定义的异常,一可以是其他运行时异常)往外抛给Controller层,
Controller层的异常也不进行处理而是直接往外抛,最后被统一异常处理类捕获并处理。
要实现统一异常处理,通常要有如下几个类
1、自定义异常类(如数据验证不合法直接抛出自定义异常,可不用)
2、统一结果集封装类(方便前端处理数据,可以不用)
3、统一异常处理类
下面上代码
自定义异常类:
package com.laowang.springboot.functions;
public class GlobalException extends Exception{
public GlobalException(String message){
super(message);
}
}
统一结果集封装类
package com.laowang.springboot.functions;
public class JsonResult {
private Integer status;
private String message;
private Object data;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMassege() {
return message;
}
public void setMassege(String massege) {
this.message = massege;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public JsonResult(Integer status) {
this.status = status;
}
public JsonResult(Integer status, String massege) {
this.status = status;
this.message = massege;
}
public JsonResult(Integer status, Object data) {
this.status = status;
this.data=data;
}
public JsonResult(Object data) {
if (data!=null) {
this.data = data;
this.status=1;
}else {
this.status=0;
}
}
}
统一异常处理类
package com.laowang.springboot.functions;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(GlobalException.class)
public JsonResult GlobalHandler(HttpServletRequest req,GlobalException e){
String msg = req.getRequestURI()+",ErrMsg:"+e.getMessage();
return new JsonResult(0,msg);
}
@ExceptionHandler(Exception.class)
public JsonResult ExcptionHandler(HttpServletRequest req,Exception e){
String msg = req.getRequestURI()+",Exception:"+e.getMessage();
return new JsonResult(0,msg);
}
}
再看Controller层
@RestController
public class HelloController {
@RequestMapping("/err")
public JsonResult err() throws Exception {
throw new GlobalException("用户抛出异常");
}
}
运行结果返回Json
总结:
统一异常处理是比较简单,有些坑要注意
1、Controller方法中忘记加 throws Exception
2、在SpringBoot中异常处理类常用@RestControllerAdvice 而不是@ControllerAdvice,@RestControllerAdvice可以直接返回Json格式数据, 而@ControllerAdvice想要返回Json还要与@ResponseBody配合使用
ps: 写这篇博客希望可以帮助到想我一样的初学者,如有不当之处请大神们指出。