SpringBoot2.3.3 统一异常处理
ps: Spring Boot 2.3.0及以后不再包含Validation,需要单独导入
一、导入pom
<!--导入springBoot Version: 2.3.3.RELEASE-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--导入 springBoot validation-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
二、配置 --> 定义异常处理,扫描需要处理异常的控制层
import com.suncp.common.exception.BizCodeEnume;
import com.suncp.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
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 java.util.HashMap;
import java.util.Map;
/**
* 集中处理所有异常
*
* @date 2020/11/15 23:11
*/
@Slf4j
//@ResponseBody
//@ControllerAdvice(basePackages = "com.suncp.mall.product.controller")
// 上面两个二合一,通过切面控制进行通知
@RestControllerAdvice(basePackages = "com.suncp.mall.product.controller")
public class MallExceptionControllerAdvice {
// 使用@ExceptionHandler标注方法可以处理的异常
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException e) {
log.info("数据校验出现问题{},异常类型:{}", e.getMessage(), e.getClass());
BindingResult result = e.getBindingResult();
Map<String, String> errorMap = new HashMap<>();
result.getFieldErrors().forEach((fieldError) -> {
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
});
return R.error(BizCodeEnume.VALID_EXCEPTION.getCode(), BizCodeEnume.VALID_EXCEPTION.getMsg()).put("data", errorMap);
}
// 使用@ExceptionHandler标注方法可以处理的异常
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable) {
log.error("错误:", throwable);
// 自定义的code值通过enum枚举类列举
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
- 新增分组
– 新增接口类型命名为 AddGroup、UpdateGroup用来对同一字段在不同场景下进行校验
三、使用
// demo包含了分组校验,使用分组校验需要提前建立好分组接口,对每个字段指定分组
/**
* 检索首字母
*/
@NotEmpty(groups = {AddGroup.class})
@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母", groups = {UpdateGroup.class, AddGroup.class})
private String firstLetter;
/**
* 品牌logo地址
*/
@NotEmpty(groups = {AddGroup.class})
@URL(message = "logo必须是一个合法的url地址", groups = {UpdateGroup.class, AddGroup.class})
private String logo;
// @Validated({AddGroup.class}) : 定义分组
@RequestMapping("/save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand/*, BindingResult result*/) {
// if (result.hasErrors()){
// Map<String,String> map = new HashMap<>();
// // 1. 获取校验的错误结果
// result.getFieldErrors().forEach((item) -> {
// // FieldError 获取到错误提示
// String message = item.getDefaultMessage();
// // 获取错误的属性的名字
// String field = item.getField();
// map.put(field, message);
// });
// return R.error(400, "提交的数据不合法").put("data", map);
// }else {
// brandService.save(brand);
// }
brandService.save(brand);
return R.ok();
}