代碼:
去掉@Valid後的BindingResult
@RequestMapping("/save") // @RequiresPermissions("product:brand:save") public R save(@Valid @RequestBody BrandEntity brand){ brandService.save(brand); return R.ok(); }
異常處理類處理BindingResult及返回結果
package com.atguigu.gulimall.product.exception; import com.atguigu.common.exception.BizCodeEnume; import com.atguigu.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; /** * @Description: * @Author: zyn * @Date: 2021-6-30 */ /** * 集中處理所有異常 */ @Slf4j @RestControllerAdvice public class GulimallExceptionControllerAdvice { @ExceptionHandler(value = MethodArgumentNotValidException.class)//指定處理的異常類型 public R handleValidException(MethodArgumentNotValidException e){ log.error("數據校驗出現問題{},異常類型{}",e.getMessage(),e.getClass()); BindingResult result=e.getBindingResult(); Map<String,String> map = new HashMap<>(); result.getFieldErrors().forEach(x->{ map.put(x.getField(),x.getDefaultMessage()); }); return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",map); } @ExceptionHandler(value = Throwable.class)//其他公共異常,優先級小於指定異常 public R handleException(Throwable e){ return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()); } }
全局錯誤碼定義規範開發
package com.atguigu.common.exception; /** * @Description: * @Author: zyn * @Date: 2021-6-30 */ /*** * 錯誤碼和錯誤信息定義類 * 1. 錯誤碼定義規則爲5爲數字 * 2. 前兩位表示業務場景,最後三位表示錯誤碼。例如:100001。10:通用 001:系統未知異常 * 3. 維護錯誤碼後需要維護錯誤描述,將他們定義爲枚舉形式 * 錯誤碼列表: * 10: 通用 * 001:參數格式校驗 * 11: 商品 * 12: 訂單 * 13: 購物車 * 14: 物流 */ public enum BizCodeEnume { UNKNOW_EXCEPTION(10000,"系統未知異常"), VAILD_EXCEPTION(10001,"參數格式校驗失敗"); private int code; private String msg; BizCodeEnume(int code,String msg){ this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; } }
測試效果:
代碼裏有寫了註釋,貌似沒什麼要說的了