-
引入依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.3.4.RELEASE</version> </dependency>
-
后端逻辑代码
/** * 使用统一异常处理,通过@RestControllerAdvice能自动获取抛出的异常 * @param brand * @return */ @RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand){ brandService.save(brand); return R.ok(); }
-
异常处理类
package com.kenai.gulimall.product.exception; import com.kenai.common.exception.BizCodeEnum; import com.kenai.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.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; /** * 集中处理所有异常 * @RestControllerAdvice注解相当于@ResponseBody注解和@ControllerAdvice注解的合体 * @ResponseBody注解: 结果返回json数据返回到页面上 * @ControllerAdvice注解: 处理异常 */ @RestControllerAdvice(basePackages = "com.kenai.gulimall.product.controller") @Slf4j public class GulimallExceptionControllerAdvice { @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e){ log.error("数据校验出现问题:{},异常类型:{}", e.getMessage(), e.getClass()); BindingResult bindingResult = e.getBindingResult(); Map<String, String> errorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((item) -> { errorMap.put(item.getField(), item.getDefaultMessage()); }); return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", errorMap); } /** * Throwable是exception和error的父类。如果出现MethodArgumentNotValidException外的其他异常,则用该方法处理 * @param throwable * @return */ @ExceptionHandler(value = Throwable.class) public R handleException(Throwable throwable){ return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg()); } }
-
错误码和错误信息定义(枚举)类
package com.kenai.common.exception; /** * 错误码和错误信息定义类 * 1, 错误码定义规则为五位数字 * 2。 前两位表示业务场景,最后三位表示错误码。比如10001: 10表示通用,001表示系统未知异常 * 3。 维护错误码后需要维护错误描述,将他们定义为枚举类型 * 错误码列表: * 10:通用 * 001:参数格式校验 * 11:商品 * 12:订单 * 13:购物车 * 14:物流 */ public enum BizCodeEnum { UNKNOWN_EXCEPTION(10000, "系统未知异常"), VALID_EXCEPTION(10001, "系统格式校验失败"); private int code; private String msg; BizCodeEnum(int code, String msg){ this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; } }