boot spring 对参数检测_【springboot】@Valid参数校验
轉(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jdbc和mysql面试题_JDBC数据
- 下一篇: java ror框架搭建_ROR 环境的