亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解

 更新時(shí)間:2023年05月16日 09:30:39   作者:JK凱  
在 SpringBoot項(xiàng)目開發(fā)中,有一個(gè)觀點(diǎn)是不要相信前端傳入的參數(shù),因?yàn)槟悴恢烙脩羰窃趺床僮魑覀兘涌诘模栽诤蠖艘残枰獙?duì)參數(shù)進(jìn)行校驗(yàn),這篇文章主要講講我們項(xiàng)目中最常使用的驗(yàn)證方案

一、引入相應(yīng)的依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

spring-boot-starter-validation本質(zhì)是使用的Hibernate Validator,它并沒(méi)有自己的實(shí)現(xiàn)。

二、Validation的基本校驗(yàn)注解

空檢查

  • @Null            驗(yàn)證對(duì)象是否為null
  • @NotNull        驗(yàn)證對(duì)象是否不為null, 無(wú)法查檢長(zhǎng)度為0的字符串
  • @NotBlank        檢查約束字符串是不是Null還有被Trim的長(zhǎng)度是否大于0,只對(duì)字符串,且會(huì)去掉前后空格.
  • @NotEmpty        檢查約束元素是否為NULL或者是EMPTY. 

Booelan檢查

  • @AssertTrue        驗(yàn)證 Boolean 對(duì)象是否為 true  
  • @AssertFalse    驗(yàn)證 Boolean 對(duì)象是否為 false  

長(zhǎng)度檢查

  • @Size(min=, max=)        驗(yàn)證對(duì)象(Array,Collection,Map,String)長(zhǎng)度是否在給定的范圍之內(nèi)  
  • @Length(min=, max=)        驗(yàn)證注解的元素值長(zhǎng)度在min和max區(qū)間內(nèi)

日期檢查

  • @Past        驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之前  
  • @Future        驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之后  
  • @Pattern    驗(yàn)證 String 對(duì)象是否符合正則表達(dá)式的規(guī)則

數(shù)值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因?yàn)楸韱沃禐?ldquo;”時(shí)無(wú)法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null

@Min            驗(yàn)證 Number 和 String 對(duì)象是否大等于指定的值  

@Max            驗(yàn)證 Number 和 String 對(duì)象是否小等于指定的值  

@DecimalMax        被標(biāo)注的值必須不大于約束中指定的最大值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最大值的字符串表示.小數(shù)存在精度

@DecimalMin        被標(biāo)注的值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最小值的字符串表示.小數(shù)存在精度

@Digits            驗(yàn)證 Number 和 String 的構(gòu)成是否合法  

@Digits(integer=,fraction=)        驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。

@Range(min=, max=)    驗(yàn)證注解的元素值在最小值和最大值之間

@Range(min=10000,max=50000,message="range.bean.wage")

@Valid 寫在方法參數(shù)前,遞歸的對(duì)該對(duì)象進(jìn)行校驗(yàn), 如果關(guān)聯(lián)對(duì)象是個(gè)集合或者數(shù)組,那么對(duì)其中的元素進(jìn)行遞歸校驗(yàn),如果是一個(gè)map,則對(duì)其中的值部分進(jìn)行校驗(yàn).(是否進(jìn)行遞歸驗(yàn)證)

@CreditCardNumber信用卡驗(yàn)證

@Email  驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過(guò)驗(yàn)證。

@ScriptAssert(lang= ,script=, alias=)

@URL(protocol=,host=, port=,regexp=, flags=)

三、添加參數(shù)校驗(yàn)

在我們對(duì)應(yīng)的DTO上并在controller的上添加校驗(yàn)。

1.在DTO的屬性上添加校驗(yàn)

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import java.util.UUID;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class registryUserDto {
    @NotBlank(message = "用戶名不能為空")
    private String username;
    @NotBlank(message = "密碼不能為空")
    @Length(min = 6, max = 20, message = "密碼長(zhǎng)度在6-20之間")
    private String password;
    @Min(value = 0, message = "年齡最小為0")
    @Max(value = 200, message = "年齡最大為200")
    private Integer age;
    @NotBlank(message = "郵箱不能為空")
    @Email(message = "郵箱格式不正確")
    private String email;
    @JsonIgnore
    private String salt = UUID.randomUUID().toString().replaceAll("-", "");
    private Boolean admin;
}

通過(guò)在參數(shù)上添加各種校驗(yàn)注解實(shí)現(xiàn)校驗(yàn)

2.在controller對(duì)應(yīng)的DTO添加@Valid或者@Validated

@PostMapping("/registry")
public ResponseResult registryUser(@RequestBody @Valid registryUserDto registryUserDto) {
    return ResponseResult.okResult(registryUserDto);
}

這樣添加后就可以對(duì)其中的參數(shù)實(shí)現(xiàn)校驗(yàn)了,當(dāng)校驗(yàn)失敗時(shí)接口就會(huì)返回500異常和相應(yīng)的異常信息。

對(duì)于復(fù)雜String校驗(yàn)我們可以使用正則來(lái)校驗(yàn),如下所示:

@Pattern(regexp = "^1(3|4|5|7|8)\d{9}$",message = "手機(jī)號(hào)碼格式錯(cuò)誤")
@NotBlank(message = "手機(jī)號(hào)碼不能為空")
private String phone;

另外對(duì)于單個(gè)參數(shù)的校驗(yàn),沒(méi)有用DTO對(duì)象來(lái)接收的參數(shù)也可以校驗(yàn),先在controller類上添加@Validated,再在對(duì)應(yīng)的參數(shù)前加校驗(yàn)注解,如下所示:

@RestController
@RequestMapping("/user")
@Validated
public class UserController {
    @PostMapping("/registry")
    public ResponseResult registryUser(@NotBlank(message = "name不能為空") String name) {
        return ResponseResult.okResult(name);
    }
}

四、自定義校驗(yàn)注解

對(duì)于一些常見(jiàn)的或復(fù)雜的校驗(yàn)需要我們需要自定義校驗(yàn)注解,實(shí)現(xiàn)如下:

1.新建自定義注解

annotation.validator.Status:

import com.jk.validator.StatusValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StatusValidator.class})
public @interface Status {

    String[] statusType() default {};

    String message() default "狀態(tài)傳遞有誤";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

2.實(shí)現(xiàn)相應(yīng)的校驗(yàn)

import com.jk.annotation.validator.Status;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;
public class StatusValidator implements ConstraintValidator<Status, Integer> {
    private List<String> typeStatus ;
    @Override
    public void initialize(Status constraintAnnotation) {
        typeStatus = Arrays.asList(constraintAnnotation.statusType());
        ConstraintValidator.super.initialize(constraintAnnotation);
    }
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        if(value !=null){
            if(!typeStatus.contains(String.valueOf(value))){
                return false;
            }
        }
        return true;
    }
}

3.自定義注解的使用

@Status(statusType = {"1", "2"})
private Integer status;

五、校驗(yàn)失敗統(tǒng)一異常處理

大家可以看到我們上面校驗(yàn)失敗的響應(yīng)msg非常不友好,有很多前端不需要知道的消息。

我們基于全局統(tǒng)一異常處理來(lái)添加校驗(yàn)失敗的處理,不太清楚統(tǒng)一異常處理的可以看我另一篇文章SpringBoot統(tǒng)一響應(yīng)格式及統(tǒng)一異常處理

在統(tǒng)一異常處理中添加BindException的處理

exception.GlobalExceptionHandler:

import com.jk.enums.AppHttpCodeEnum;
import com.jk.exception.SystemException;
import com.jk.domain.vo.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler(SystemException.class)
    public ResponseResult systemExceptionHandler(SystemException e) {
        log.error("出現(xiàn)了異常! {}", e);
        return ResponseResult.errorResult(e.getCode(), e.getMsg());
    }
    @ExceptionHandler(Exception.class)
    public ResponseResult exceptionHandler(Exception e) {
        log.error("出現(xiàn)了異常! {}", e);
        return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), e.getMessage());
    }
    /* 添加校驗(yàn)參數(shù)異常處理 */
    @ExceptionHandler(BindException.class)
    public ResponseResult bindExceptionHandler(BindException e) {
        log.error("出現(xiàn)了異常! {}", e);
        return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }
}

校驗(yàn)失敗時(shí)前端接收的到的響應(yīng)如下:

可以看到異常信息非常友好,也非常方便前端彈出消息框提示!

這樣就在SpringBoot的項(xiàng)目中添加了參數(shù)校驗(yàn)及統(tǒng)一異常處理,其實(shí)整體非常簡(jiǎn)單,也希望大家在項(xiàng)目中用起來(lái)!

以上就是SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Validation參數(shù)校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • NIO深入理解FileChannel使用方法原理

    NIO深入理解FileChannel使用方法原理

    這篇文章主要為大家介紹了NIO深入理解FileChannel的源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Spring實(shí)現(xiàn)跨域的幾種方式小結(jié)

    Spring實(shí)現(xiàn)跨域的幾種方式小結(jié)

    這篇文章主要給大家總結(jié)了幾種Spring實(shí)現(xiàn)跨域的方式,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)我們的學(xué)習(xí)活工作有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • java基本教程之常用的實(shí)現(xiàn)多線程的兩種方式 java多線程教程

    java基本教程之常用的實(shí)現(xiàn)多線程的兩種方式 java多線程教程

    下面開始學(xué)習(xí)“常用的實(shí)現(xiàn)多線程的2種方式”:Thread 和 Runnable。之所以說(shuō)是常用的,是因?yàn)橥ㄟ^(guò)還可以通過(guò)java.util.concurrent包中的線程池來(lái)實(shí)現(xiàn)多線程
    2014-01-01
  • SpringBoot基于Actuator遠(yuǎn)程關(guān)閉服務(wù)

    SpringBoot基于Actuator遠(yuǎn)程關(guān)閉服務(wù)

    這篇文章主要介紹了SpringBoot基于Actuator遠(yuǎn)程關(guān)閉服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java實(shí)現(xiàn)文件的上傳功能

    java實(shí)現(xiàn)文件的上傳功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件的上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 基于request.getAttribute與request.getParameter的區(qū)別詳解

    基于request.getAttribute與request.getParameter的區(qū)別詳解

    本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下
    2013-04-04
  • Java從源碼角度解析SpringMVC執(zhí)行流程

    Java從源碼角度解析SpringMVC執(zhí)行流程

    這篇文章主要介紹了Java從源碼角度解析SpringMVC執(zhí)行流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • application.yml的格式寫法和pom.xml讀取配置插件方式

    application.yml的格式寫法和pom.xml讀取配置插件方式

    這篇文章主要介紹了application.yml的格式寫法和pom.xml讀取配置插件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • ZooKeeper開發(fā)實(shí)際應(yīng)用案例實(shí)戰(zhàn)

    ZooKeeper開發(fā)實(shí)際應(yīng)用案例實(shí)戰(zhàn)

    這篇文章主要為大家介紹了ZooKeeper開發(fā)的實(shí)際應(yīng)用案例實(shí)戰(zhàn),文中附含詳細(xì)開發(fā)應(yīng)用源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-01-01
  • java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例

    java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例

    ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來(lái)介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論