版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljk126wy/article/details/83243900
我们可以通过@ControllerAdvice (控制增强)+ @ExceptionHandler 进行统一异常处理,ExceptionHandler注解可以设置全局处理控制里的异常类型来拦截要处理的异常。 例如:@ExceptionHandler(value = Exception.class)
定义restfull 返回json 数据的消息实例,其中包含 code:错误码,0表示没有异常信息。 message:异常提示信息 date:无异常返回具体内容。
package cn.lijunkui.unifiedException.message;
/**
* restfull 请求返回json 信息实体类
* @author lijunkui
* @param <T>
*/
public class ReturnMessage<T> {
private Integer code;//错误码
private String message;//提示信息
private T date;//返回具体内容
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public ReturnMessage(Integer code, String message, T date) {
super();
this.code = code;
this.message = message;
this.date = date;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getDate() {
return date;
}
public void setDate(T date) {
this.date = date;
}
}
处理 返回json 数据的消息实例工具类,主要包含是3个方法 1 成功处理含实体数据 2 成功处理 没有实体数据 3 失败处理
package cn.lijunkui.unifiedException.message;
/**
* json 消息处理工具类
* @author Administrator
*
*/
public class ReturnMessageUtil {
/**
* 无异常 请求成功并有具体内容返回
* @param object
* @return
*/
public static ReturnMessage<Object> sucess(Object object) {
ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
return message;
}
/**
* 无异常 请求成功并无具体内容返回
* @return
*/
public static ReturnMessage<Object> sucess() {
ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
return message;
}
/**
* 有自定义错误异常信息
* @param code
* @param msg
* @return
*/
public static ReturnMessage<Object> error(Integer code,String msg) {
ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
return message;
}
}
自定以系统异常
package cn.lijunkui.unifiedException.customexception;
public class SbException extends RuntimeException{
private static final long serialVersionUID = -8201518085425482189L;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
private Integer code;
public SbException(Integer code,String message) {
super(message);
this.code = code;
}
}
进行异常的统一拦截处理
package cn.lijunkui.unifiedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import cn.lijunkui.unifiedException.customexception.SbException;
import cn.lijunkui.unifiedException.message.ReturnMessage;
import cn.lijunkui.unifiedException.message.ReturnMessageUtil;
//@ControllerAdvice
@RestControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value = Exception.class)
//@ResponseBody
public ReturnMessage<Object> handle(Exception exception) {
if(exception instanceof SbException) {
SbException sbexception = (SbException)exception;
return ReturnMessageUtil.error(sbexception.getCode(), sbexception.getMessage());
}else {
logger.error("系统异常 {}",exception);
return ReturnMessageUtil.error(-1, "未知异常"+exception.getMessage());
}
}
}
进行测试 分别测试自定义异常和系统异常。
package cn.lijunkui.unifiedException.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.lijunkui.unifiedException.customexception.SbException;
@RestController
@RequestMapping("/error")
public class DemoException {
@GetMapping(value = "custome")
public void customException() {
SbException sbe = new SbException(100, "这个是自定义异常!");
throw sbe;
}
@GetMapping(value = "unknown")
public void unknownException() {
int i = 0;
int b = 1/i;
}
}
测试结果:
demo版本说明:
springboot版本:2.0.5.RELEASE
jdk版本:1.8.0_144