springboot之Validation參數(shù)校驗詳細解讀
一 Validation參數(shù)校驗
Validation參數(shù)校驗是指在程序運行中對傳進來的參數(shù)進行合法性檢查,以保證程序的正確性和安全性。在實際開發(fā)中,正確的校驗能夠避免因惡意輸入或錯誤輸入而導致的程序崩潰、漏洞等問題。
二 校驗入門
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 異常捕獲
全局異常捕獲,當出現(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;
四 分組校驗
默認情況下,不指定分組都屬于默認組;使用分組校驗有利于分層校驗開發(fā);
新建2個接口,一個用于查詢, 一個用于添加
/** * @Author lsc * <p> </p> */ public interface ADD extends Default { }
public interface Select extends Default { }
修改 實體校驗規(guī)則,如果不指定分組 默認是 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)文章
使用IDEA啟動項目遇見ClassNotFoundException的解決方案
這篇文章主要介紹了使用IDEA啟動項目遇見ClassNotFoundException的正確解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06使用 Redis 緩存實現(xiàn)點贊和取消點贊的示例代碼
這篇文章主要介紹了使用 Redis 緩存實現(xiàn)點贊和取消點贊的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03springboot整合netty框架實現(xiàn)站內(nèi)信
Netty 是一個基于NIO的客戶、服務(wù)器端編程框架,使用Netty 可以確保你快速和簡單的開發(fā)出一個網(wǎng)絡(luò)應(yīng)用,這篇文章主要介紹了springboot整合netty框架的方式小結(jié),需要的朋友可以參考下2022-12-12Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(PriorityQueue)用法詳解
優(yōu)先級隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),操作的數(shù)據(jù)帶有優(yōu)先級,這種數(shù)據(jù)結(jié)構(gòu)就是優(yōu)先級隊列(PriorityQueue)。本文將詳細講講Java優(yōu)先級隊列的用法,感興趣的可以了解一下2022-07-07SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析
這篇文章主要介紹了SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Java中使用jaxp進行sax解析_動力節(jié)點Java學院整理
使用SAX的優(yōu)勢在于其解析速度較快,相對于DOM而言占用內(nèi)存較少。這篇文章主要介紹了Java中使用jaxp進行sax解析,需要的朋友可以參考下2017-08-08使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細代碼
這篇文章主要介紹了使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細代碼,主要基于JWT的身份認證,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03