SpringBoot 2.7教程:SpringBoot + Web 项目搭建及实践应用-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot + Web 项目搭建,异常捕获处理-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot + Mysql 项目应用-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 集成 jsp 页面开发 -2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 实现文件上传,图片上传并显示功能-2022年最新图文版本
SpringBoot 2.7教程:springboot 设置全局字符编码,解决乱码问题-2022年最新图文版
SpringBoot 2.7教程:SpringBoot mybatis 多数据源的整合方法-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 整合 RocketMQ 项目搭建-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 整合 RabbitMQ 项目搭建-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 整合 MongoDB 项目搭建-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 整合 Redisson 项目搭建-2022年最新图文版本
SpringBoot 2.7教程:SpringBoot 整合 Redis 项目搭建-2022年最新图文版本
1.异常捕获,转化为通用异常信息。
当前最新的版本是2.7,下面我们开始进行搭建系统。
接上一章,如果出现了参数异常的情况。如下图:
2022-06-10 11:42:14.021 WARN 7544 --- [nio-8080-exec-9] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.xiaoma.usercenter.response.ApiResult
我们需要将这个异常信息捕获,并转化为通用错误。
package com.xiaoma.usercenter;
import com.xiaoma.usercenter.response.ApiResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.stream.Collectors;
/**
* @author fenghaikuan
* @description 全局异常处理,处理自定义的异常,其他异常往外抛
* @className GlobalExceptionHandler
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
*
* @param
* @return
*/
@ResponseBody
@ExceptionHandler(value = ConstraintViolationException.class)
public ApiResult constraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return ApiResult.failed(20000, "ConstraintViolationException,输入数据异常" + message);
}
/**
* 处理Post请求,参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
* 添加全局异常处理流程,根据需要设置需要处理的异常,以MethodArgumentNotValidException为例
*
* @param e
* @return ApiResult
* @throws Exception
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Object MethodArgumentNotValidHandler(MethodArgumentNotValidException e) throws Exception {
HashMap errorMsg = new HashMap();
for (FieldError fieldError : e.getBindingResult().getFieldErrors()) {
errorMsg.put(fieldError.getField(), fieldError.getDefaultMessage());
}
return ApiResult.failed(20000, "MethodArgumentNotValidException,输入数据异常" + errorMsg);
}
/**
* 处理Get请求,使用@Valid 验证路径中请求实体校验失败后抛出的异常,详情继续往下看代码
*
* @param bindException
* @return ApiResult
*/
@ExceptionHandler(BindException.class)
public ApiResult bindExceptionHandler(BindException bindException) {
HashMap errorMsg = new HashMap();
for (FieldError fieldError : bindException.getBindingResult().getFieldErrors()) {
errorMsg.put(fieldError.getField(), fieldError.getDefaultMessage());
}
return ApiResult.failed(20000, "BindException,输入数据异常" + errorMsg);
}
}
使用PostMan测试一下