统一异常返回非常简单就是@RestControllerAdvice+@ExceptionHandler()这两个注解
一、新建一个自定义异常类,继承RuntimeException
public class CommonException extends RuntimeException {
String message;
@Override
public String getMessage() {
return super.getMessage();
}
public void setMessage(String message) {
this.message = message;
}
public CommonException(String message) {
this.message = message;
}
}
二、统一返回序列化为json的类Result,
注意:Result一定要加上@data注解,可能是我这个类有大小问题,此处可以参考https://blog.youkuaiyun.com/APPTITE/article/details/104600529/
@Data
public class Result<T> {
private boolean success = false;
private String message = null;
private T bean = null;
//构造器私有
private Result() {
}
/**
* 通用返回成功
*
* @param bean
* @param <K>
* @return
*/
public static <K> Result<K> success(K bean) {
Result<K> result = new Result<K>();
result.success = true;
result.message = null;
result.bean = bean;
return result;
}
/**
* 通用返回失败
*
* @param bean
* @param <K>
* @return
*/
public static <K> Result<K> failed(K bean) {
Result<K> result = new Result<K>();
result.success = true;
result.message = null;
result.bean = bean;
return result;
}
/**
* 返回失败的消息
*
* @param message
* @param <K>
* @return
*/
public static <K> Result<K> failed(String message) {
Result<K> result = new Result<K>();
result.success = false;
result.message = message;
result.bean = null;
return result;
}
/**
* 生成一个成功的提示消息
* @param message
* @param <K>
* @return
*/
public static <K> Result<K> ok(String message) {
Result<K> result = new Result<K>();
result.success = true;
result.message = message;
result.bean = null;
return result;
}
/**
* 返回成功结果并带有message
*
* @param bean
* @param message
* @param <K>
* @return
*/
public static <K> Result<K> successAndMessage(K bean, String message) {
Result<K> result = new Result<K>();
result.success = true;
result.message = message;
result.bean = bean;
return result;
}
/**
* 返回失败结果并带有message
*
* @param bean
* @param message
* @param <K>
* @return
*/
public static <K> Result<K> failedAndMessage(K bean, String message) {
Result<K> result = new Result<K>();
result.success = false;
result.message = message;
result.bean = bean;
return result;
}
}
三、新建一个全局异常处理类GlobalExceptionHandler
@RestControllerAdvice是@ControllerAdvice和@@ResponseBody结合
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 所有的异常处理
* //Exception 这个是所有异常的父类
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public Object exceptionHandler(HttpServletRequest request, Exception e) {
log.error("", e);
return Result.failed("系统运行发生异常,并且controller中未处理");
}
/**
* 拦截自定异常
* @param commonException
* @return
*/
@ExceptionHandler(CommonException.class)
public Object commonException(HttpServletRequest request, CommonException commonException) {
log.error("", commonException);
return Result.failed("系统运行发生异常,并且controller中未处理");
}
/**
* 拦截参数绑定错误
* @param e
* @return
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public Object handleBindException(BindException e) {
log.error("参数绑定错误", e);
return Result.failed("参数绑定错误");
}
@ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
@ResponseBody
public Result handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException exception) {
log.error("处理方法不支持", exception);
return Result.failed("处理方法不支持");
}
}
四、测试
@RequestMapping(value = "/err")
@ResponseBody
public Result testErr(String name) {
log.info(name+"222222222222222222222222222222222222");
if (true) {
throw new CommonException("扣减库存异常");
}
return Result.ok("rrr");
}
输入http://127.0.0.1:8081/sbm/err

本文介绍了如何在SpringBoot2.2.6中使用@RestControllerAdvice和@ExceptionHandler来统一处理异常并返回JSON格式的错误信息。首先创建一个自定义异常类,继承自RuntimeException。然后定义一个用于序列化错误信息到JSON的Result类,确保添加了@Data注解。接着,创建一个全局异常处理类GlobalExceptionHandler,利用@RestControllerAdvice进行配置。最后通过测试,验证了当触发异常时,系统能够返回预定格式的错误信息。

被折叠的 条评论
为什么被折叠?



