国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

@Valid、@Validated參數(shù)校驗詳解

這篇具有很好參考價值的文章主要介紹了@Valid、@Validated參數(shù)校驗詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

@Valid與@Validated作用

@Valid@Validated都是用來校驗接收參數(shù)的。
 
@Valid是使用Hibernate validation的時候使用
 
@Validated是只用Spring Validator校驗機制使用
 
說明:java的JSR303聲明了@Valid這類接口,而Hibernate-validator對其進行了實現(xiàn)。
 
 
 
@Validated@Valid區(qū)別:
 
@Validated:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性(字段)上,不支持嵌套檢測
@Valid:可以用在方法、構造函數(shù)、方法參數(shù)和成員屬性(字段)上,支持嵌套檢測
 
 
 
注意:SpringBoot使用@Valid注解需要引入如下POM
 
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

校驗參數(shù)注解含義

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-M6CfNsNC-1687851467867)(images/20200913110853722.png)]

全局異常處理類

說明:若不做異常處理,@Validated注解的默認異常消息如下(示例):

2020-09-05 21:48:38.106  WARN 9796 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String com.example.validateddemo.controller.DemoController.validatedDemo1(com.example.validateddemo.entity.dto.UseDto): [Field error in object 'useDto' on field 'username': rejected value [null]; codes [NotBlank.useDto.username,NotBlank.username,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [useDto.username,username]; arguments []; default message [username]]; default message [用戶名不能為空!]] ]

因此我們在這里做了一個全局的異常處理類,用于處理參數(shù)校驗失敗后拋出的異常,同時進行日志輸出。

package com.example.validateddemo.handler;
 
import com.example.validateddemo.base.Result;
import com.example.validateddemo.enums.ResultEnum;
import com.example.validateddemo.utils.ResultUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
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 org.springframework.web.bind.annotation.ResponseStatus;
import java.util.List;
 
/**
 * @author He Changjie on 2020/9/5
 */
@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {
 
    /**
     * 處理@Validated參數(shù)校驗失敗異常
     * @param exception 異常類
     * @return 響應
     */
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result exceptionHandler(MethodArgumentNotValidException exception){
        BindingResult result = exception.getBindingResult();
        StringBuilder stringBuilder = new StringBuilder();
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            if (errors != null) {
                errors.forEach(p -> {
                    FieldError fieldError = (FieldError) p;
                    log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());
                    stringBuilder.append(fieldError.getDefaultMessage());
                });
            }
        }
        return ResultUtil.validatedException(stringBuilder.toString());
    }
}

基礎參數(shù)校驗

實體類

package com.example.validateddemo.entity.dto;
 
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
 
import javax.validation.constraints.*;
 
/**
 * 用戶實體
 * 數(shù)據(jù)傳輸對象
 * @author He Changjie on 2020/9/5
 */
@Data
public class User1Dto {
    /**
     * 用戶名
     */
    @NotBlank(message = "用戶名不能為空!")
    private String username;
    /**
     * 性別
     */
    @NotBlank(message = "性別不能為空!")
    private String gender;
    /**
     * 年齡
     */
    @Min(value = 1, message = "年齡有誤!")
    @Max(value = 120, message = "年齡有誤!")
    private int age;
    /**
     * 地址
     */
    @NotBlank(message = "地址不能為空!")
    private String address;
    /**
     * 郵箱
     */
    @Email(message = "郵箱有誤!")
    private String email;
    /**
     * 手機號碼
     */
    @Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$",message = "手機號碼有誤!")
    private String mobile;
}

控制類

package com.example.validateddemo.controller;
 
import com.example.validateddemo.entity.dto.Use1Dto;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author He Changjie on 2020/9/5
 */
@RestController
@RequestMapping("/api/v1")
public class Demo1Controller {
 
    @PostMapping("/insert")
    public String validatedDemo1(@Validated @RequestBody Use1Dto use1Dto){
        System.out.println(use1Dto);
        return "success";
    }
}

測試

1、參數(shù)校驗不通過:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qZ6aFCYZ-1687851467868)(images/20200905225032404.png)]

嵌套參數(shù)驗證

驗證實體中的其他需要被驗證的對象集合或其他對象

實體類

package com.example.validateddemo.entity.dto;
 
import lombok.Data;
 
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
 
/**
 * 隊伍實體
 * 數(shù)據(jù)傳輸對象
 * @author He Changjie on 2020/9/5
 */
@Data
public class Team1Dto {
    /**
     * 隊伍名稱
     */
    @NotBlank(message = "隊伍名稱不能為空!")
    private String name;
    /**
     * 隊伍人員
     */
    @NotNull(message = "隊伍人員不能為空!")
    @Valid
    private List<User1Dto> userList;
 
    /**
     * 隊伍負責人
     */
    @NotNull(message = "隊伍負責人不能為空!")
    @Valid
    private User1Dto user;
}

控制類

package com.example.validateddemo.controller;
 
import com.example.validateddemo.base.Result;
import com.example.validateddemo.entity.dto.Team1Dto;
import com.example.validateddemo.entity.dto.Use1Dto;
import com.example.validateddemo.utils.ResultUtil;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author He Changjie on 2020/9/5
 */
@RestController
@RequestMapping("/api/v1")
public class Demo1Controller {
 
    @PostMapping("/insert")
    public Result validatedDemo1(@Validated @RequestBody Use1Dto use1Dto){
        return ResultUtil.success(use1Dto);
    }
 
    @PostMapping("/insert2")
    public Result validatedDemo2(@Validated @RequestBody Team1Dto team1Dto){
        return ResultUtil.success(team1Dto);
    }
}

分組參數(shù)驗證

將不同的校驗規(guī)則分給不同的組,在使用時,指定不同的校驗規(guī)則,可以用于更新和新增接口不同的校驗規(guī)則

接口類

package com.example.validateddemo.interfaces;
 
/**
 * 校驗分組1
 * @author He Changjie on 2020/9/5
 */
public interface Group1 {
}
package com.example.validateddemo.interfaces;
 
/**
 * 校驗分組2
 * @author He Changjie on 2020/9/5
 */
public interface Group2 {
}

實體類

package com.example.validateddemo.entity.dto;
 
import com.example.validateddemo.interfaces.Group1;
import com.example.validateddemo.interfaces.Group2;
import lombok.Data;
 
import javax.validation.constraints.*;
 
/**
 * @author He Changjie on 2020/9/5
 */
@Data
public class User2Dto {
    /**
     * 用戶名
     */
    @NotBlank(message = "用戶名不能為空!", groups = {Group1.class})
    private String username;
    /**
     * 性別
     */
    @NotBlank(message = "性別不能為空!")
    private String gender;
    /**
     * 年齡
     */
    @Min(value = 1, message = "年齡有誤!", groups = {Group1.class})
    @Max(value = 120, message = "年齡有誤!", groups = {Group2.class})
    private int age;
    /**
     * 地址
     */
    @NotBlank(message = "地址不能為空!")
    private String address;
    /**
     * 郵箱
     */
    @Email(message = "郵箱有誤!", groups = {Group2.class})
    private String email;
    /**
     * 手機號碼
     */
    @Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$",message = "手機號碼有誤!", groups = {Group2.class})
    private String mobile;
}

控制類

package com.example.validateddemo.controller;
 
import com.example.validateddemo.base.Result;
import com.example.validateddemo.entity.dto.Team1Dto;
import com.example.validateddemo.entity.dto.User1Dto;
import com.example.validateddemo.entity.dto.User2Dto;
import com.example.validateddemo.interfaces.Group1;
import com.example.validateddemo.interfaces.Group2;
import com.example.validateddemo.utils.ResultUtil;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author He Changjie on 2020/9/5
 */
@RestController
@RequestMapping("/api/v1")
public class Demo1Controller {
 
    @PostMapping("/insert")
    public Result validatedDemo1(@Validated @RequestBody User1Dto user1Dto){
        return ResultUtil.success(user1Dto);
    }
 
    @PostMapping("/insert2")
    public Result validatedDemo2(@Validated @RequestBody Team1Dto team1Dto){
        return ResultUtil.success(team1Dto);
    }
 
    @PostMapping("/insert3")
    public Result validatedDemo3(@Validated @RequestBody User2Dto user2Dto){
        return ResultUtil.success(user2Dto);
    }
 
    @PostMapping("/insert4")
    public Result validatedDemo4(@Validated(Group1.class) @RequestBody User2Dto user2Dto){
        return ResultUtil.success(user2Dto);
    }
 
    @PostMapping("/insert5")
    public Result validatedDemo5(@Validated(Group2.class) @RequestBody User2Dto user2Dto){
        return ResultUtil.success(user2Dto);
    }
}

@Valid和@Validated 區(qū)別

通過源碼分析:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid {
}
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
    Class<?>[] value() default {};
}
分組驗證

@Valid:沒有分組的功能。

@Validated:提供了一個分組功能,可以在入?yún)Ⅱ炞C時,根據(jù)不同的分組采用不同的驗證機制

嵌套驗證

@Validated:可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性(字段)上,不支持嵌套檢測,只能通過@Valid配合實現(xiàn)嵌套校驗。

@Valid:可以用在方法、構造函數(shù)、方法參數(shù)和成員屬性(字段)上,支持嵌套檢測,可以用在list,set等集合上實現(xiàn)嵌套校驗文章來源地址http://www.zghlxwxcb.cn/news/detail-506814.html

到了這里,關于@Valid、@Validated參數(shù)校驗詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • spring參數(shù)校驗@Validated及嵌套校驗

    本文介紹項目中校驗 @Validated的使用,主要分參數(shù)對象屬性校驗,嵌套校驗,集合在對象屬性中校驗,集合作為參數(shù)校驗。 controller層 測試輸入 輸出 這里作為參數(shù),如果使用List接收是不起作用的,必須用ValidList,這個類中有標記 @Valid @Valid private ListE list = new ArrayList(); 如果在

    2024年02月09日
    瀏覽(25)
  • spring-boot 請求參數(shù)校驗:注解 @Validated 的使用、手動校驗、自定義校驗

    spring-boot中可以用@validated來校驗數(shù)據(jù),如果數(shù)據(jù)異常則會統(tǒng)一拋出異常,方便異常中心統(tǒng)一處理。 spring-boot已經(jīng)引入了基礎包,所以直接使用就可以。 在屬性上添加校驗注解: 在Controller上添加 @Validated 注解 校驗未通過時,可能看到: 在 @Validated 后面緊跟著追加BindingResult,

    2023年04月16日
    瀏覽(33)
  • java如何優(yōu)雅的實現(xiàn)參數(shù)非空校驗,快速實現(xiàn)參數(shù)非空校驗,使用@valid實現(xiàn)參數(shù)非空校驗

    在java項目接口中,有些必傳參數(shù)需要進行非空校驗,如果參數(shù)過多,代碼會繁雜且冗余,如何優(yōu)雅的對參數(shù)進行非空校驗,下面是實現(xiàn)流程 用實體類接收參數(shù),使用非空注解編輯參數(shù)內(nèi)容 使用 @Valid 注解對參數(shù)進行攔截,整體進行非空校驗 如果是SpringBoot項目,引入web開發(fā)包

    2024年02月08日
    瀏覽(25)
  • Java參數(shù)校驗@Valid中@Length和@Size的用法和區(qū)別

    在Spring框架中,@Length和@Size都是用于參數(shù)長度校驗的注解,但它們之間存在一些關鍵的區(qū)別: @Length 是Hibernate Validator提供的一個注解,它用于校驗字符串的長度。 @Size 也是Hibernate Validator提供的注解,但它可以用于多種數(shù)據(jù)類型,不僅僅是字符串。對于字符串,它可以校驗長

    2024年04月15日
    瀏覽(26)
  • Spring Boot @Validated 和Javax的@Valid配合使用

    Spring Boot @Validated 和Javax的@Valid配合使用

    @Validation 和@Valid 常常配合使用對傳輸?shù)膮?shù)進行數(shù)據(jù)校驗的注解,并通過配置全局異常處理器進行合理化的提示,增加用戶的體驗 并且@Validated可以通過分組來指定什么時候觸發(fā)什么樣的參數(shù)校驗(這里看一下就行,下面有說什么是分組) 其實不用這兩個注解也可以完成對傳

    2024年02月09日
    瀏覽(27)
  • 如何優(yōu)雅的寫代碼-替代大量if else的@valid、@validated注解

    如何優(yōu)雅的寫代碼-替代大量if else的@valid、@validated注解

    @Valid 注解通常用于對象屬性字段的規(guī)則檢測,具體啥意思,下面讓我娓娓道來: 下面我們以新增一個員工為功能切入點,以常規(guī)寫法為背景,慢慢烘托出 @Valid 注解用法詳解。 那么,首先,我們會有一個員工對象 Employee,如下 :首先我們會有一個員工對象 Employee,如下 :

    2024年01月18日
    瀏覽(36)
  • Springboot——@valid 做字段校驗和自定義注解

    Springboot——@valid 做字段校驗和自定義注解

    再項目開發(fā)中,針對前端傳遞的參數(shù)信息,有些接口中需要寫大量的 if 判斷,導致代碼臃腫,不夠優(yōu)雅。 此時,可以使用 @Valid 實現(xiàn)基本的字段校驗。 springboot 2.3之前 ,直接進行開發(fā)即可,無需引用額外的依賴 集成在 spring-boot-starter-web 中。 springboot 2.3之后 需要額外引入

    2023年04月26日
    瀏覽(22)
  • Golang校驗字符串是否JSON格式方法json.Valid源碼解析

    上篇文章《Golang中如何校驗字符串是否為JSON格式?》主要講解了使用json.Valid校驗字符串是否JSON格式的使用方法,本文來剖析一下json.Valid方法的源碼。 json.Valid方法定義: scan := newScanner() 獲取一個 scanner 類型的對象,關鍵的是checkValid方法,checkValid源碼如下: 首先調(diào)用了sc

    2023年04月26日
    瀏覽(19)
  • 接收來自客戶端的參數(shù)使用【JSR303校驗框架】進行校驗參數(shù)是否合法

    接收來自客戶端的參數(shù)使用【JSR303校驗框架】進行校驗參數(shù)是否合法

    目錄 1:JSR303校驗 1.1:統(tǒng)一校驗的需求 1.2:統(tǒng)一校驗實現(xiàn) 1.3:分組校驗 1.4:校驗規(guī)則不滿足? 前端請求后端接口傳輸參數(shù),是在controller中校驗還是在Service中校驗? 答案是都需要校驗,只是分工不同。 Contoller中校驗請求參數(shù)的合法性,包括:必填項校驗,數(shù)據(jù)格式校驗,

    2023年04月27日
    瀏覽(28)
  • 還在用 if else 做參數(shù)校驗?快來學習高級參數(shù)校驗吧

    還在用 if else 做參數(shù)校驗?快來學習高級參數(shù)校驗吧

    在上一篇文章 Springboot實現(xiàn)優(yōu)雅的參數(shù)校驗(Spring Validation)和 if else說再見,我們介紹了 Spring Validation 的初級用法,在實際開發(fā)中,無論是 Bean Validation 定義的約束,還是 Hibernate Validator 附加的約束,都是無法滿足我們復雜的業(yè)務場景。所以,我們需要自定義約束。開發(fā)自定

    2023年04月14日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包