天天看點

springmvc使用@Valid和@ControllerAdvise實作請求參數校驗統一異常處理

這裡寫自定義目錄标題

1.常見表單驗證注解

限制 說明
@Null 限制隻能為null
@NotNull 限制必須不為null
@AssertTrue 限制必須為true
@DecimalMax(value) 限制必須為一個不大于指定值的數字
@DecimalMin(value) 限制必須為一個不小于指定值的數字
@Digits(integer,fraction) 限制必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Future 限制必須是一個将來的日期
@Max(value) 限制必須為一個不大于指定值的數字
@Min(value) 限制必須為一個不小于指定值的數字
@Past 限制必須是一個過去的日期
@Pattern(value) 限制必須符合指定的正規表達式
@Size(max,min) 限制字元長度必須在min到max之間
@NotEmpty 驗證注解的元素值不為null且不為空(字元串長度不為0、集合大小不為0)
@NotBlank 驗證注解的元素值不為空(不為null、去除首位空格後長度為0),不同于@NotEmpty,@NotBlank 隻應用于字元串且在比較時會去除字元串的空格
@Email 驗證注解的元素值是Email,也可以通過正規表達式和flag指定自定義的email格式

2.代碼實作

建立model其中兩個字段增加注解

@NotBlank(message = "使用者名稱不能為空")
    @ApiModelProperty(value = "使用者名稱")
    private String userName;

    @Email(message = "請填寫正确的郵箱")
    @ApiModelProperty(value = "郵箱")
    private String email;
           

Controller

在需要校驗的model前增加@Valid 注解

@RequestMapping(method = RequestMethod.POST)
	    public String test(@Valid @RequestBody TestEntity model) {
	        try {
	            testEntityService.insert(model);
	            return "";
	        }catch (Exception e){
	            return "";
	        }
	    }
           

統一異常處理

通過ControllerAdvice和@ExceptionHandler注解,在Controller中發生的異常錯誤就到指定異常處理方法進行處理。

@ControllerAdvice
	public class DoControllerAdvice {
	    private static final Logger logger = LoggerFactory.getLogger(DoControllerAdvice.class);
	
	    /**
	     * @param e
	     * @return d1.framework.webapi.http.Result
	     * @Description 必填校驗異常處理
	     * @Date 2019-07-30
	     */
	    @ResponseBody
	    @ExceptionHandler(value = MethodArgumentNotValidException.class)
	    public Result errorHandler(MethodArgumentNotValidException e) {
	        String errorMsg = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
	        logger.error("未處理異常", errorMsg);
	        return ResultUtil.fail(errorMsg);
	    }
	}
           
springmvc使用@Valid和@ControllerAdvise實作請求參數校驗統一異常處理

看一下MethodArgumentNotValidException這個類的源碼 ,它繼承了Exception,包含參數和錯誤。BindError參數實作了error。 統一異常處理類實作完成。

繼續閱讀