SpringBoot集成Validation參數(shù)校驗(yàn)
本文實(shí)例為大家分享了SpringBoot集成Validation參數(shù)校驗(yàn)的具體代碼,供大家參考,具體內(nèi)容如下
1、依賴
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> ? ? <groupOd>org.glassfish</groupId> ? ? <artifactId>jakarta.el</artifactId> ? ? <version>3.0.3</version> </dependency>
2、常用約束說(shuō)明
package com.smile.project.validator.utils; ? public class 常用約束說(shuō)明 { ? ? ? /** ? ? ?* @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):元素是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi) ? ? ?* @Past:一個(gè)過(guò)去的日期 ? ? ?* @Future:一個(gè)將來(lái)的日期 ? ? ?* @Pattern(regex=,flag=):指定的正則表達(dá)式 ? ? ?* @URL:必須是一個(gè)URL ? ? ?* @Email:必須是email格式 ? ? ?* @NotBlank:字符串不能為空 ? ? ?* @NotEmpty:集合不能為空 ? ? ?* @Length:長(zhǎng)度必須在指定范圍內(nèi) ? ? ?* @Valid:對(duì)實(shí)體類(lèi)進(jìn)行校驗(yàn) ? ? ?*/ ? }
3、實(shí)體約束示例
import com.smile.project.validator.utils.Gender; import lombok.Data; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; ? @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; ? }
4、控制層示例
需要在class加上@Validated注解
如果參數(shù)時(shí)實(shí)體,需要加上@Valid注解
import com.smile.project.validator.entity.SysUser; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import javax.validation.constraints.NotNull; ? @RestController @Validated public class SysUserController { ? ? ? /** ? ? ?* 方法參數(shù)為實(shí)體校驗(yàn) ? ? ?*/ ? ? @PostMapping("/register") ? ? public ResponseEntity register(@Valid SysUser sysUser){ ? ? ? ? return ResponseEntity.ok(sysUser); ? ? } ? ? ? /** ? ? ?* 方法參數(shù)校驗(yàn) ? ? ?*/ ? ? @GetMapping("user") ? ? public ResponseEntity getUser(@NotNull(message = "用戶名不能為空") String username){ ? ? ? ? SysUser sysUser = new SysUser(); ? ? ? ? sysUser.setName("smile"); ? ? ? ? return ResponseEntity.ok(sysUser); ? ? } ? }
5、異常捕獲
全局異常捕獲,當(dāng)出現(xiàn)參數(shù)校驗(yàn)不合法時(shí)捕獲異常,并且返回給前端
import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.HashMap; import java.util.List; import java.util.Set; ? /** ?* 全局異常捕獲 ?* 當(dāng)出翔參數(shù)校驗(yàn)不合法時(shí)捕獲異常,并且返回給前端 ?*/ @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); ? ? } ? }
6、自定義校驗(yàn)規(guī)則
特殊的字段需要自定義規(guī)則,比如身份證號(hào)碼,郵箱,電話等
6.1、定義校驗(yàn)注解
import com.smile.project.validator.utils.GenderValidator; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; ? /** ?* 定義校驗(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 {}; ? }
6.2、GenderValidator實(shí)現(xiàn)ConstraintValidator接口并提供校驗(yàn)規(guī)則
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; ? /** ?* 實(shí)現(xiàn)ConstraintValidator接口并提供校驗(yàn)規(guī)則 ?*/ 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 content) { ? ? ? ? return "男".equals(value) || "女".equals(value); ? ? } }
6.3、在成員變量中使用注解
import com.smile.project.validator.utils.Gender; import lombok.Data; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; ? @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; ? ? ? @Gender() ? ? private String gender; ? }
7、分組校驗(yàn)
默認(rèn)情況下,不指定分組都屬于默認(rèn)組;使用分組校驗(yàn)有利于分層校驗(yàn)開(kāi)發(fā)
7.1、新建兩個(gè)接口,一個(gè)用于查詢,一個(gè)用于添加
public interface ADD extends Default { ? } ? public interface Select extends Default { ? }
7.2、修改尸體校驗(yàn)規(guī)則,如果不指定分組默認(rèn)時(shí)Default組;
import com.smile.project.validator.utils.Gender; import lombok.Data; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; ? @Data public class SysUser { ? ? ? private Long id; ? ? ? @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; ? ? ? @Gender() ? ? private String gender; ? }
7.3、控制層示例,此時(shí)只會(huì)校驗(yàn)ADD組和Default組
//分組校驗(yàn) @PostMapping("/user") public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){ ? ? return ResponseEntity.ok(sysUser); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring?Boot集成validation實(shí)現(xiàn)參數(shù)校驗(yàn)功能
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
- SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
- SpringBoot使用validation做參數(shù)校驗(yàn)的實(shí)現(xiàn)步驟
- SpringBoot使用validation-api實(shí)現(xiàn)對(duì)枚舉類(lèi)參數(shù)校驗(yàn)的方法
- SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)的示例
- spring boot validation參數(shù)校驗(yàn)實(shí)例分析
- springboot+dubbo+validation 進(jìn)行rpc參數(shù)校驗(yàn)的實(shí)現(xiàn)方法
- spring?參數(shù)校驗(yàn)Validation示例詳解
相關(guān)文章
Spring的refresh()方法相關(guān)異常解析
這篇文章主要介紹了Spring的refresh()方法相關(guān)異常解析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之無(wú)權(quán)無(wú)向圖
這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之無(wú)權(quán)無(wú)向圖?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01java ThreadPoolExecutor線程池拒絕策略避坑
這篇文章主要為大家介紹了java ThreadPoolExecutor拒絕策略避坑踩坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07詳解Java消息隊(duì)列-Spring整合ActiveMq
本篇文章主要介紹了詳解Java消息隊(duì)列-Spring整合ActiveMq ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)
這篇文章主要介紹了java中的數(shù)學(xué)計(jì)算函數(shù)的總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-07-07