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

springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀

 更新時(shí)間:2023年10月08日 10:18:17   作者:知識(shí)追尋者  
這篇文章主要介紹了springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀,本篇是關(guān)于springboot的參數(shù)校驗(yàn)知識(shí),當(dāng)然也適用其它java應(yīng)用,讀完本篇將學(xué)會(huì)基本的參數(shù)校驗(yàn),自定義參數(shù)校驗(yàn)和分組參數(shù)校驗(yàn),需要的朋友可以參考下

一 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 控制層示例

  1. 需要在class加上 @Validated ;
  2. 如果參數(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的解決方案

    這篇文章主要介紹了使用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)贊的示例代碼

    這篇文章主要介紹了使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • springboot整合netty框架實(shí)現(xiàn)站內(nèi)信

    springboot整合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-12
  • 基于重定向RedirectAttributes的用法解析

    基于重定向RedirectAttributes的用法解析

    這篇文章主要介紹了基于重定向RedirectAttributes的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(PriorityQueue)用法詳解

    Java數(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-07
  • SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析

    SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析

    這篇文章主要介紹了SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java中使用jaxp進(jìn)行sax解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中使用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ì)代碼

    這篇文章主要介紹了使用Spring?Boot?2.x構(gòu)建Web服務(wù)的詳細(xì)代碼,主要基于JWT的身份認(rèn)證,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • SpringMVC項(xiàng)目異常處理機(jī)制詳解

    SpringMVC項(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
  • 解析java中This的用法分析

    解析java中This的用法分析

    本篇文章是對(duì)java中This的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論