JSR 303参数校验 统一异常处理 优化业务代码 (二)
1 全局异常处理
1 参数校验的地方 在Controller 每次都要写一大块代码 太麻烦了
2 优化:用 ControllerAdvice 来捕获 参数校验时 出现的异常信息
增加 GulimallExceptionControllerAdvice 来捕获异常
package com.atguigu.gulimall.product.exception; import com.atguigu.common.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.bind.BindResult; 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; /** * 集中处理所有异常 */ @Slf4j @RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller") public class GulimallExceptionControllerAdvice { @ExceptionHandler(value = MethodArgumentNotValidException.class) //指定能处理什么异常 public R handleVaildException(MethodArgumentNotValidException e){ BindingResult result= e.getBindingResult(); Map<String,String> errorMap=new HashMap<>(); result.getFieldErrors().forEach(fieldError->{ errorMap.put(fieldError.getField(),fieldError.getDefaultMessage()); }); log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass()); return R.error(400,"数据校验出现错误").put("error",errorMap); } }
简化业务代码
3 测试