springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀
一 Validation參數(shù)校驗(yàn)
Validation參數(shù)校驗(yàn)是指在程序運(yùn)行中對(duì)傳進(jìn)來的參數(shù)進(jìn)行合法性檢查,以保證程序的正確性和安全性。在實(shí)際開發(fā)中,正確的校驗(yàn)?zāi)軌虮苊庖驉阂廨斎牖蝈e(cuò)誤輸入而導(dǎo)致的程序崩潰、漏洞等問題。
二 校驗(yàn)入門
2.1 pom.xml
springboot在 web啟動(dòng)器中已經(jīng)包含validator包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
非springboot項(xiàng)目,需要自行引入依賴
<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) : 個(gè)數(shù)字的值小于等于指定的最大值
- @DecimalMin(value) :大數(shù)值大于等于指定的最小值
- @DecimalMax(value): 大數(shù)值小于等于指定的最大值
- @Size(max=, min=) : 元素的大小在指定的范圍內(nèi)
- @Digits (integer, fraction) : 元素是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi)
- @Past: 一個(gè)過去的日期
- @Future : 一個(gè)將來的日期
- @Pattern(regex=,flag=) :指定的正則表達(dá)式
- @URL:必須是一個(gè)URL
- @Email:必須是email格式
- @NotBlank: 字符串不能為空
- @NotEmpty:集合不能為空
- @Length: 長(zhǎng)度必須在指定范圍內(nèi)
- @Valid :對(duì)實(shí)體類進(jìn)行校驗(yàn)
2.3 實(shí)體約束示例
簡(jiǎn)單注解約束使用示例如下;如果成員是實(shí)體,需要帶上 @Valid 注解;
/** * @Author lsc * <p> </p> */ @Data public class SysUser { private Long id; @NotNull(message ="用戶名不能為空") @Size(min = 3, max = 5, message = "用戶名長(zhǎng)度為{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ù)是實(shí)體 需要 加上 @Valid 注解
/** * @Author lsc * <p> </p> */ @RestController @Validated public class SysUserController { // 方法參數(shù)為實(shí)體校驗(yàn) @PostMapping("/register") public ResponseEntity register(@Valid @RequestBody SysUser sysUser){ return ResponseEntity.ok(sysUser); } // 方法參數(shù)校驗(yàn) @GetMapping("user") public ResponseEntity getUser(@NotNull(message ="用戶名不能為空") String username) { SysUser sysUser = new SysUser(); sysUser.setName("知識(shí)追尋者"); return ResponseEntity.ok(sysUser); } }
2.5 異常捕獲
全局異常捕獲,當(dāng)出現(xiàn)參數(shù)校驗(yàn)不合法時(shí)捕獲異常,并且返回給前端;
/** * @Author lsc * <p> </p> */ @ControllerAdvice public class GlobHandler { // 捕獲方法參數(shù)校驗(yàn)異常 @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í)體參數(shù)校驗(yàn)異常 @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 請(qǐng)求示例
三 自定義校驗(yàn)規(guī)則
特殊的字段需要自定義規(guī)則,比如身份證號(hào)碼,郵箱,電話等;
定義校驗(yàn)注解
@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 實(shí)現(xiàn) ConstraintValidator 接口并提供校驗(yàn)規(guī)則
/** * @Author lsc * <p> </p> */ public class GenderValidator implements ConstraintValidator<Gender, String> { // 初始化校驗(yàn)值 @Override public void initialize(Gender constraintAnnotation) { } // 校驗(yàn)規(guī)則 @Override public boolean isValid(String value, ConstraintValidatorContext context) { return "男".equals(value) || "女".equals(value); } }
在成員變量使用 注解
@Gender() private String gender;
四 分組校驗(yàn)
默認(rèn)情況下,不指定分組都屬于默認(rèn)組;使用分組校驗(yàn)有利于分層校驗(yàn)開發(fā);
新建2個(gè)接口,一個(gè)用于查詢, 一個(gè)用于添加
/** * @Author lsc * <p> </p> */ public interface ADD extends Default { }
public interface Select extends Default { }
修改 實(shí)體校驗(yàn)規(guī)則,如果不指定分組 默認(rèn)是 Default 組;
@NotNull(message ="用戶名不能為空",groups = ADD.class) @Size(min = 3, max = 5, message = "用戶名長(zhǎng)度為{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;
控制層示例,此時(shí)只會(huì)校驗(yàn) ADD 組和 Default組
// 分組校驗(yàn) @PostMapping("/user") public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){ return ResponseEntity.ok(sysUser); }
到此這篇關(guān)于springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Validation參數(shù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用IDEA啟動(dòng)項(xiàng)目遇見ClassNotFoundException的解決方案
這篇文章主要介紹了使用IDEA啟動(dòng)項(xiàng)目遇見ClassNotFoundException的正確解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的示例代碼
這篇文章主要介紹了使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03springboot整合netty框架實(shí)現(xiàn)站內(nèi)信
Netty 是一個(gè)基于NIO的客戶、服務(wù)器端編程框架,使用Netty 可以確保你快速和簡(jiǎn)單的開發(fā)出一個(gè)網(wǎng)絡(luò)應(yīng)用,這篇文章主要介紹了springboot整合netty框架的方式小結(jié),需要的朋友可以參考下2022-12-12Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(PriorityQueue)用法詳解
優(yōu)先級(jí)隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),操作的數(shù)據(jù)帶有優(yōu)先級(jí),這種數(shù)據(jù)結(jié)構(gòu)就是優(yōu)先級(jí)隊(duì)列(PriorityQueue)。本文將詳細(xì)講講Java優(yōu)先級(jí)隊(duì)列的用法,感興趣的可以了解一下2022-07-07SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析
這篇文章主要介紹了SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Java中使用jaxp進(jìn)行sax解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
使用SAX的優(yōu)勢(shì)在于其解析速度較快,相對(duì)于DOM而言占用內(nèi)存較少。這篇文章主要介紹了Java中使用jaxp進(jìn)行sax解析,需要的朋友可以參考下2017-08-08使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細(xì)代碼
這篇文章主要介紹了使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細(xì)代碼,主要基于JWT的身份認(rèn)證,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03SpringMVC項(xiàng)目異常處理機(jī)制詳解
SpringMVC是一種基于Java,實(shí)現(xiàn)了Web MVC設(shè)計(jì)模式,請(qǐng)求驅(qū)動(dòng)類型的輕量級(jí)Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡?qǐng)求驅(qū)動(dòng)指的就是使用請(qǐng)求-響應(yīng)模型,框架的目的就是幫助我們簡(jiǎn)化開發(fā),SpringMVC也是要簡(jiǎn)化我們?nèi)粘eb開發(fā)2022-08-08