日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

boot spring 对参数检测_【springboot】@Valid参数校验

發(fā)布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boot spring 对参数检测_【springboot】@Valid参数校验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:

https://blog.csdn.net/cp026la/article/details/86495659

扯淡:

剛開始寫代碼的時候?qū)?shù)的校驗要么不做、要么寫很多類似 if( xx == null){ … }的語句,總想?yún)?shù)校驗可以交給前端處理(很機智),服務(wù)端對參數(shù)的校驗同樣重要。

參數(shù)校驗:

springboot需要引入spring-boot-starter-validation(使用Hibernate Validator 框架提供驗證功能) 依賴進行參數(shù)校驗,由于本項目中已經(jīng)引入了spring-boot-starter-web 依賴(包含spring-boot-starter-validation依賴),就不需要重復(fù)引用了。

1、基本注解介紹:

@NotEmpty:作用在String、collection、map、數(shù)組上,不能為null,size > 0

@NotBlank: 只能用于String,不能為null,也不可以是" ",即trim()后長度大于0

@@NotNull:作用于任何類型,不能為null,可以為空

@AssertTrue:必須為true

@AssertFalse:必須為false

@Min(value):必須為一個數(shù)字,且值大于等于指定的值

@Max(value):必須為一個數(shù)字,且值小于等于指定的值

@Size(max,min):限制參數(shù)大小范圍

@Future:必須是一個將來的日期

@Past:必須是一個過去的日期

@Pattern(value):指定正則

2、實體類:

/**

* @Auther: xf

* @Date: 2018/11/01 23:27

* @Description:

*/

@Data

public class ValidEntity {

@NotBlank(message = "name不可以為空")

@Size(min = 2,max = 4,message = "name的長度范圍為2-4")

private String name;

@NotNull(message = "age 不能為null")

@Min(value = 0, message = "age 最小值不能小于0")

private int age;

}

3、測試Controller:

/**

* @Auther: xf

* @Date: 2018/11/01 23:35

* @Description: 測試參數(shù)校驗

*/

@RestController

@Slf4j

public class TestValidController {

@PostMapping(value = "/valid")

public ApiResult valid(@Valid @RequestBody ValidEntity validEntity) {

log.info(">>>>實體類信息為:>>>>{}", JSON.toJSONString(validEntity));

return ApiResult.ok(validEntity);

}

}

4、測試結(jié)果:

此處為POST請求,使用Postman:

4.1、正確傳參(此處為JSON格式的參數(shù))返回結(jié)果正確。

4.2、錯誤傳參 錯誤響應(yīng)信息

錯誤日志:

5、注意:

此處的日志很顯然是統(tǒng)一異常處理類GlobalExceptionHandler中的日志,即參數(shù)校驗不通過的時候走到了統(tǒng)一異常處理類中了。這里返回了所有的異常信息,顯得不優(yōu)雅,我們可以在統(tǒng)一異常處理類中斷點調(diào)試得到該JSON格式錯誤的參數(shù)校驗不通過是使用的MethodArgumentNotValidException 返回的。

6、當(dāng)我將請求參數(shù)的@RequestBody 去掉后:

@PostMapping(value = "/valid")

public ApiResult valid(@Valid ValidEntity validEntity) {

log.info(">>>>實體類信息為:>>>>{}", JSON.toJSONString(validEntity));

return ApiResult.ok(validEntity);

}

再次請求:

斷點調(diào)試得到的是BindException

于是,我們可以在統(tǒng)一異常處理類中添加這兩個異常的處理方法,當(dāng)然也可以在原來的Exception 處理中去做判斷,這里分別添加這兩個異常的處理。

7、修改原來的全局異常處理類:

@RestControllerAdvice(annotations = {RestController.class})

@Slf4j

public class GlobalExceptionHandler {

/**

* 默認(rèn)統(tǒng)一異常處理方法

* @ExceptionHandler 注解用來配置需要攔截的異常類型, 也可以是自定義異常

*/

@ExceptionHandler(Exception.class)

// 此處可以指定返回的狀態(tài)碼 和 返回 結(jié)果說明

// @ResponseStatus(reason = "exception",value = HttpStatus.BAD_REQUEST)

public Object runtimeExceptionHandler(Exception e) {

// 打印異常信息到控制臺

e.printStackTrace();

log.error("請求出現(xiàn)異常,異常信息為: {}", e.getMessage());

// 使用公共的結(jié)果類封裝返回結(jié)果, 這里我指定狀態(tài)碼為 400

return ApiResult.build(400, e.getMessage());

}

@ExceptionHandler(MethodArgumentNotValidException.class)

public ApiResult handleBindException(MethodArgumentNotValidException ex) {

FieldError fieldError = ex.getBindingResult().getFieldError();

log.info("參數(shù)校驗異常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());

return ApiResult.build(400, fieldError.getDefaultMessage());

}

@ExceptionHandler(BindException.class)

public ApiResult handleBindException(BindException ex) {

FieldError fieldError = ex.getBindingResult().getFieldError();

log.info("參數(shù)校驗異常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());

return ApiResult.build(400, fieldError.getDefaultMessage());

}

}

至此參數(shù)校驗配置完畢。

總結(jié)

以上是生活随笔為你收集整理的boot spring 对参数检测_【springboot】@Valid参数校验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。