springboot之Validation參數(shù)校驗詳細解讀
一 Validation參數(shù)校驗
Validation參數(shù)校驗是指在程序運行中對傳進來的參數(shù)進行合法性檢查,以保證程序的正確性和安全性。在實際開發(fā)中,正確的校驗?zāi)軌虮苊庖驉阂廨斎牖蝈e誤輸入而導(dǎo)致的程序崩潰、漏洞等問題。
二 校驗入門
2.1 pom.xml
springboot在 web啟動器中已經(jīng)包含validator包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>非springboot項目,需要自行引入依賴
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>3.0.3</version>
</dependency>2.2 常用約束說明
- @Null: 元素為 null
- @NotNull : 元素不為 null
- @AssertTrue : 元素為 true
- @AssertFalse : 元素為 false
- @Min(value) : 數(shù)字的值大于等于指定的最小值
- @Max(value) : 個數(shù)字的值小于等于指定的最大值
- @DecimalMin(value) :大數(shù)值大于等于指定的最小值
- @DecimalMax(value): 大數(shù)值小于等于指定的最大值
- @Size(max=, min=) : 元素的大小在指定的范圍內(nèi)
- @Digits (integer, fraction) : 元素是一個數(shù)字,其值必須在可接受的范圍內(nèi)
- @Past: 一個過去的日期
- @Future : 一個將來的日期
- @Pattern(regex=,flag=) :指定的正則表達式
- @URL:必須是一個URL
- @Email:必須是email格式
- @NotBlank: 字符串不能為空
- @NotEmpty:集合不能為空
- @Length: 長度必須在指定范圍內(nèi)
- @Valid :對實體類進行校驗
2.3 實體約束示例
簡單注解約束使用示例如下;如果成員是實體,需要帶上 @Valid 注解;
/**
* @Author lsc
* <p> </p>
*/
@Data
public class SysUser {
private Long id;
@NotNull(message ="用戶名不能為空")
@Size(min = 3, max = 5, message = "用戶名長度為{min}-{max}之間")
private String username;
@NotNull(message ="昵稱不能為空")
private String name;
@NotNull(message ="密碼不能為空")
private String password;
@Email(message = "郵箱格式不合法")
private String email;
private String gender;
}2.4 控制層示例
- 需要在class加上 @Validated ;
- 如果參數(shù)是實體 需要 加上 @Valid 注解
/**
* @Author lsc
* <p> </p>
*/
@RestController
@Validated
public class SysUserController {
// 方法參數(shù)為實體校驗
@PostMapping("/register")
public ResponseEntity register(@Valid @RequestBody SysUser sysUser){
return ResponseEntity.ok(sysUser);
}
// 方法參數(shù)校驗
@GetMapping("user")
public ResponseEntity getUser(@NotNull(message ="用戶名不能為空") String username) {
SysUser sysUser = new SysUser();
sysUser.setName("知識追尋者");
return ResponseEntity.ok(sysUser);
}
}2.5 異常捕獲
全局異常捕獲,當(dāng)出現(xiàn)參數(shù)校驗不合法時捕獲異常,并且返回給前端;
/**
* @Author lsc
* <p> </p>
*/
@ControllerAdvice
public class GlobHandler {
// 捕獲方法參數(shù)校驗異常
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e){
Set<ConstraintViolation<?>> message = e.getConstraintViolations();
HashMap<String, Object> map = new HashMap<>();
message.stream().forEach(msg -> {
String path = msg.getPropertyPath().toString();
String field = path.substring(path.indexOf(".")+1);
map.put(field,msg.getMessageTemplate());
});
return ResponseEntity.ok(map);
}
// 捕獲實體參數(shù)校驗異常
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResponseEntity resolveMethodArgumentNotValidException(MethodArgumentNotValidException e){
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
HashMap<String, Object> map = new HashMap<>();
allErrors.stream().forEach(error -> {
FieldError fieldError = (FieldError) error;
map.put(fieldError.getField(), fieldError.getDefaultMessage());
});
return ResponseEntity.ok(map);
}
}2.6 請求示例


三 自定義校驗規(guī)則
特殊的字段需要自定義規(guī)則,比如身份證號碼,郵箱,電話等;
定義校驗注解
@Target({ METHOD, FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = GenderValidator.class)
@Documented
public @interface Gender {
String message() default "性別為男或者女";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default {};
}GenderValidator 實現(xiàn) ConstraintValidator 接口并提供校驗規(guī)則
/**
* @Author lsc
* <p> </p>
*/
public class GenderValidator implements ConstraintValidator<Gender, String> {
// 初始化校驗值
@Override
public void initialize(Gender constraintAnnotation) {
}
// 校驗規(guī)則
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return "男".equals(value) || "女".equals(value);
}
}在成員變量使用 注解
@Gender()
private String gender;
四 分組校驗
默認(rèn)情況下,不指定分組都屬于默認(rèn)組;使用分組校驗有利于分層校驗開發(fā);
新建2個接口,一個用于查詢, 一個用于添加
/**
* @Author lsc
* <p> </p>
*/
public interface ADD extends Default {
}public interface Select extends Default {
}修改 實體校驗規(guī)則,如果不指定分組 默認(rèn)是 Default 組;
@NotNull(message ="用戶名不能為空",groups = ADD.class)
@Size(min = 3, max = 5, message = "用戶名長度為{min}-{max}之間")
private String username;
@NotNull(message ="昵稱不能為空", groups = Select.class)
private String name;
@NotNull(message ="密碼不能為空",groups = ADD.class)
private String password;
@Email(message = "郵箱格式不合法", groups = Select.class)
private String email;控制層示例,此時只會校驗 ADD 組和 Default組
// 分組校驗
@PostMapping("/user")
public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){
return ResponseEntity.ok(sysUser);
}到此這篇關(guān)于springboot之Validation參數(shù)校驗詳細解讀的文章就介紹到這了,更多相關(guān)Validation參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Android中使用WebView在線查看PDF文件的方法示例
在Android應(yīng)用開發(fā)中,有時我們需要在客戶端展示PDF文件,以便用戶可以閱讀或交互,這篇文章主要介紹了在Android中使用WebView在線查看PDF文件的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-09-09
如何利用IDEA搭建SpringBoot項目整合mybatis實現(xiàn)簡單的登錄功能
這篇文章主要介紹了如何利用IDEA搭建SpringBoot項目整合mybatis實現(xiàn)簡單的登錄功能,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
MyBatis?Generator生成數(shù)據(jù)庫模型實現(xiàn)示例
這篇文章主要為大家介紹了MyBatis?Generator生成數(shù)據(jù)庫模型實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
SpringBoot數(shù)據(jù)庫恢復(fù)的兩種方法mysqldump和mysqlbinlog
binlog用來實現(xiàn)主從復(fù)制,也常用來誤刪數(shù)據(jù)庫找回丟失的記錄,本文主要介紹了SpringBoot數(shù)據(jù)庫恢復(fù)的兩種方法mysqldump和mysqlbinlog,具有一定的參考價值,感興趣的可以了解一下2024-01-01

