SpringBoot集成Validation參數(shù)校驗
本文實例為大家分享了SpringBoot集成Validation參數(shù)校驗的具體代碼,供大家參考,具體內(nèi)容如下
1、依賴
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> ? ? <groupOd>org.glassfish</groupId> ? ? <artifactId>jakarta.el</artifactId> ? ? <version>3.0.3</version> </dependency>
2、常用約束說明
package com.smile.project.validator.utils;
?
public class 常用約束說明 {
?
? ? /**
? ? ?* @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=):指定的正則表達(dá)式
? ? ?* @URL:必須是一個URL
? ? ?* @Email:必須是email格式
? ? ?* @NotBlank:字符串不能為空
? ? ?* @NotEmpty:集合不能為空
? ? ?* @Length:長度必須在指定范圍內(nèi)
? ? ?* @Valid:對實體類進(jìn)行校驗
? ? ?*/
?
}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 = "用戶名長度為{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ù)時實體,需要加上@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ù)為實體校驗
? ? ?*/
? ? @PostMapping("/register")
? ? public ResponseEntity register(@Valid SysUser sysUser){
? ? ? ? return ResponseEntity.ok(sysUser);
? ? }
?
? ? /**
? ? ?* 方法參數(shù)校驗
? ? ?*/
? ? @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ù)校驗不合法時捕獲異常,并且返回給前端
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ù)校驗不合法時捕獲異常,并且返回給前端
?*/
@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);
? ? }
?
}6、自定義校驗規(guī)則
特殊的字段需要自定義規(guī)則,比如身份證號碼,郵箱,電話等
6.1、定義校驗注解
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;
?
/**
?* 定義校驗注解
?*/
@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實現(xiàn)ConstraintValidator接口并提供校驗規(guī)則
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
?
/**
?* 實現(xiàn)ConstraintValidator接口并提供校驗規(guī)則
?*/
public class GenderValidator implements ConstraintValidator<Gender,String> {
?
? ? //初始化校驗值
? ? @Override
? ? public void initialize(Gender constraintAnnotation) {
?
? ? }
?
? ? //檢驗規(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 = "用戶名長度為{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、分組校驗
默認(rèn)情況下,不指定分組都屬于默認(rèn)組;使用分組校驗有利于分層校驗開發(fā)
7.1、新建兩個接口,一個用于查詢,一個用于添加
public interface ADD extends Default {
?
}
?
public interface Select extends Default {
?
}7.2、修改尸體校驗規(guī)則,如果不指定分組默認(rèn)時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 = "用戶名長度為{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、控制層示例,此時只會校驗ADD組和Default組
//分組校驗
@PostMapping("/user")
public ResponseEntity addUser(@Validated(value = ADD.class) @RequestBody SysUser sysUser){
? ? return ResponseEntity.ok(sysUser);
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Yml轉(zhuǎn)properties文件工具類YmlUtils的詳細(xì)過程(不用引任何插件和依賴)
這篇文章主要介紹了Yml轉(zhuǎn)properties文件工具類YmlUtils(不用引任何插件和依賴),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08
IDEA中HTML通過servlet3.0注解名提交表單到servlet類找不到頁面的問題
這篇文章主要介紹了IDEA中HTML通過servlet3.0注解名提交表單到servlet類找不到頁面的問題,本文通過場景描述及問題解析,給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
基于SpringBoot項目實現(xiàn)Docker容器化部署的主要步驟
部署SpringBoot項目到Docker容器涉及選擇Java運行時環(huán)境的基礎(chǔ)鏡像、構(gòu)建包含應(yīng)用程序的Docker鏡像、編寫Dockerfile、使用docker build命令構(gòu)建鏡像和使用docker run命令運行Docker容器等步驟2024-10-10
java數(shù)據(jù)結(jié)構(gòu)與算法之簡單選擇排序詳解
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之簡單選擇排序,結(jié)合實例形式分析了選擇排序的原理、實現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05

