SpringBoot统一异常处理

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值