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

Spring Validation 接口入?yún)⑿r?/h1>

這篇具有很好參考價值的文章主要介紹了Spring Validation 接口入?yún)⑿r?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、前言

  • JSR 是 Java Specification Requests 的縮寫,含義為 JAVA 規(guī)范提案。

  • JSR 303 - Bean Validation 規(guī)范, 正是一套基于 JavaBean 參數(shù)校驗的標(biāo)準(zhǔn)。

  • Hibernate Validator 是 JSR 303 的實現(xiàn),它提供了 JSR 303 規(guī)范中所有約束(constraint)的實現(xiàn),同時也對其作出一些拓展。

  • Spring Validation 是對 Hibernate validation 的二次封裝,用于支持 Spring MVC 參數(shù)校驗。


?? JSR 303 包含的注解:

驗證注解

驗證數(shù)據(jù)類型

說明

@Null

任意類型

元素值為 Null

@NotNull

任意類型

元素值不為 Null

@AssertTrue

Bool

元素為 true

@AssertFalse

Bool

元素為 false

@Min(value = 最小值)

BigDecimal、BigInteger、byte、short、int、long 等 Number 或 CharSequence (數(shù)字)子類型

元素值需大于等于指定值

@Max(value = 最大值)

BigDecimal、BigInteger、byte、short、int、long 等 Number 或 CharSequence (數(shù)字)子類型

元素值需小于等于指定值

@DecimalMin(value = 最小值)

BigDecimal、BigInteger、byte、short、int、long 等 Number 或 CharSequence (數(shù)字)子類型

元素值需大于等于指定值

@DecimalMax(value = 最大值)

BigDecimal、BigInteger、byte、short、int、long 等 Number 或 CharSequence (數(shù)字)子類型

元素值需小于等于指定值

@Size(min = 最小值, max = 最大值)

String、Collection、Array 等

元素值的字符長度/集合大小需在指定的區(qū)間范圍內(nèi)

@Digits(integer = 整數(shù)位數(shù), fraction = 小數(shù)位數(shù))

BigDecimal、BigInteger、byte、short、int、long 等 Number 或 CharSequence (數(shù)字)子類型

元素值整數(shù)位、小數(shù)位需小于對應(yīng)指定值

@Past

DATE、Calendar、Time 等日期

元素值需在指定時間之前

@Future

DATE、Calendar、Time 等日期

元素值需在指定時間之后

@Pattern(regexp = 正則式, flag = 標(biāo)志的模式)

String 等

元素值與指定的正則式匹配

??hibernate.validator 擴展的注解:

驗證注解

驗證數(shù)據(jù)類型

說明

@NotBlank

String 等 CharSequence 子類型

元素值不為空串(字符串不為 Null 且去除首尾空格后長度不為 0)

@Email(regexp = 正則式, flag = 標(biāo)志的模式)

String 等

元素值為電子郵箱格式,可通過 regexp、flag 屬性指定格式

@Length(min = 最小值, max = 最大值)

String 等

元素值長度在指定區(qū)間范圍內(nèi)

@NotEmpty

String、Collection、Array 等

元素值不為 Null 且長度不為 0

@Range(min = 最小值, max = 最大值)

BigDecimal、BigInteger、byte、short、int、long 等 Number 或 CharSequence (數(shù)字)子類型

元素值在指定區(qū)間范圍內(nèi)

@URL

String 等

元素值必須時合法的URL

二、Spring Validation的使用

1、在項目pom.xml中引入依賴

<!-- JSR 303 -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

<!-- 在 SpringBoot 項目中,若 SpringBoot 版本小于 2.3.x ,則此依賴已包含在 spring-boot-starter-web 中,無需添加額外依賴;
若 SpringBoot 版本大于 2.3.x ,則需手動引入依賴。-->
<!-- Hibernate Validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

2、 參數(shù)注解校驗的使用場景

場景一:直接入?yún)⒌男r?/h5>

①在類上添加 @Validated 注解,否則參數(shù)校驗無法生效;

②入?yún)⒅惺褂米⒔?@NotEmpty 等;

@Validated
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/saveUserName")
    public String saveUserInfo(@NotEmpty String userName) {
        System.out.println("userName:"+ userName +",保存成功");
        return "success";
    }
}

測試:

【請求URL】:
http://192.168.1.7:27100/user/saveUserName?userName=

【執(zhí)行結(jié)果】:
嚴(yán)重: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.ConstraintViolationException: saveUserInfo.userName: 不能為空] with root cause
javax.validation.ConstraintViolationException: saveUserInfo.userName: 不能為空
    at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:116)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
……
場景二:對象模型屬性的校驗

1、創(chuàng)建 User對象

@Data
public class User {

    private Integer id;

    @NotEmpty(message = "用戶名不能為空")
    private String userName;
    
    private Integer age;

    @NotNull(message = "用戶密碼不能為空")
    @Size(min = 5, max = 10,message = "密碼長度必須是5-10個字符")
    private String password;
}

2、全局異常捕獲

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 方法直接入?yún)⑿r?     *
     * @param ex
     * @return
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public BaseResult resolveConstraintViolationException(ConstraintViolationException ex) {
        Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
        if (!CollectionUtils.isEmpty(constraintViolations)) {
            String errorMessage = constraintViolations.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(", "));
            return BaseResult.fail(ResultEnum.ILLEGAL_PARAMETER, errorMessage);
        }
        return BaseResult.fail(ResultEnum.ILLEGAL_PARAMETER, ex.getMessage());
    }

    /**
     * 對象模型屬性校驗
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public BaseResult resolveMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        List<ObjectError> allErrors = ex.getBindingResult().getAllErrors();
        if (!CollectionUtils.isEmpty(allErrors)) {
            String errorMessage = allErrors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(", "));
            return BaseResult.fail(ResultEnum.ILLEGAL_PARAMETER, errorMessage);
        }
        return BaseResult.fail(ResultEnum.ILLEGAL_PARAMETER, ex.getMessage());
    }
}

3、通用返回結(jié)構(gòu)體

@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class BaseResult<T> {

    private Integer code;

    private String message;

    private T data;

    public static <T> BaseResult<T> success() {
        return new BaseResult(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMsg(), new JSONObject());
    }

    public static <T> BaseResult<T> fail(ResultEnum resultEnum, T data) {
        return fail(resultEnum.getCode(), resultEnum.getMsg(), data);
    }
    @Override
    public String toString() {
        return "BaseResult{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}

4、錯誤提示碼枚舉類

/**
 * 錯誤提示碼
 */
public enum ResultEnum {
    /** 狀態(tài)碼:未知錯誤 **/
    UNKNOWN_ERROR(-1, "未知錯誤"),
    /** 狀態(tài)碼:成功 **/
    SUCCESS(0, "成功"),
    /** 狀態(tài)碼:失敗 **/
    FAIL(1,"失敗"),
    /** 狀態(tài)碼:非法參數(shù) **/
    ILLEGAL_PARAMETER(2,"非法參數(shù)");

    private Integer code;

    private String msg;

    ResultEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

}

5、暴露的接口

① 在類上添加 @Validated 注解,否則參數(shù)校驗無法生效;

② 在入?yún)嶓w前添加 @Validated 注解;

@Validated
@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/saveUserInfo")
    public String saveUserInfo(@RequestBody @Validated User user) {
        System.out.println("userName:"+ user.getUserName() +",保存成功");
        return "success";
    }
}

6、測試:

【請求URL】:http://192.168.1.7:27100/user/saveUserInfo
【請求方式】:POST
【請求參數(shù)】:
{
   "userName":"張三"
}

【執(zhí)行結(jié)果】:
{
     "code": 2,
     "message": "非法參數(shù)",
     "data": "用戶密碼不能為空"
}
場景三:參數(shù)注解校驗的分組驗證

1、新建分組接口

/**
 * 分組接口:新增
 */
public interface Add {

}

/**
 * 分組接口:更新
 */
public interface Update {

}

2、在校驗注解中使用 groups 屬性標(biāo)明分組

@Data
public class User {

    @NotNull(message = "更新數(shù)據(jù)時,主鍵id不能為空", groups = Update.class)
    private Integer id;

    @NotEmpty(message = "用戶名不能為空")
    private String userName;
    
    private Integer age;

    @NotNull(message = "用戶密碼不能為空")
    @Size(min = 5, max = 10,message = "密碼長度必須是5-10個字符")
    private String password;
}

【注】需要注意的是實體類中所有字段注解校驗規(guī)則默認屬于 Default 分組,接口入?yún)?@Validated 注解默認檢驗 Default 分組的校驗規(guī)則。當(dāng)接口入?yún)⑹褂?@Validated 顯式聲明非默認分組時,實體類中所有未顯式聲明分組的注解校驗將不會生效。

3、處理器方法

@Validated
@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/updateUserInfo")
    public String updateUserInfo(@RequestBody @Validated({Update.class}) User user) {
        System.out.println("id:" + user.getId() + ",userName:"+ user.getUserName() +",更新成功");
        return "success";
    }
}

4、測試

【請求URL】:http://192.168.1.7:27100/user/updateUserInfo
【請求方式】:POST
【請求參數(shù)】:
{
  "id":1,
  "userName":"李四"
}

【執(zhí)行結(jié)果】:
id:1,userName:李四,更新成功

【注】入?yún)⒅袥]有傳“密碼”,也沒有校驗,若默認屬于 Default 分組的字段也需要校驗,可以寫成:

public String updateUserInfo(@RequestBody @Validated({Update.class, Default.class}) User user) {
場景四:級聯(lián)校驗

1、在實體類模型中,可能會存在集合類型或?qū)嶓w類型的成員變量,該成員中的字段仍然需要校驗。

在要校驗的對象類型的屬性/ list上使用 @Valid 注解:

@Data
public class User {

    @NotNull(message = "更新數(shù)據(jù)時,主鍵id不能為空", groups = Update.class)
    private Integer id;

    @NotEmpty(message = "用戶名不能為空")
    private String userName;
    
    private Integer age;

    @NotNull(message = "用戶密碼不能為空")
    @Size(min = 5, max = 10,message = "密碼長度必須是5-10個字符")
    private String password;

    @Valid
    private List<Car> cars;
}


@Data
public class Car {

    @NotNull(message = "車牌號碼不能為空")
    private String plateCode; 

    @NotNull(message = "車牌顏色不能為空")
    private String plateColor;
}

2、處理器方法

@Validated
@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping("/saveUserInfo")
    public String saveUserInfo(@RequestBody @Validated User user) {
        System.out.println("userName:"+ user.getUserName() +",保存成功");
        return "success";
    }
}

3、測試

【請求URL】:http://192.168.1.7:27100/user/saveUserInfo
【請求方式】:POST
【請求參數(shù)】:
{
        
    "userName": "李四",
    "password": "123456",
    "cars": [
        {
            "plateCode": "京A0001",
            "plateColor": "1"
        },
                {
            "plateCode": "京A0002"
        }
    ]
}

【執(zhí)行結(jié)果】:
{
     "code": 2,
     "message": "非法參數(shù)",
     "data": "車牌顏色不能為空"
}
場景五:自定義注釋校驗

如下:校驗用戶下車牌號碼必須包含“京A”,否則返回提示;

1、自定義注釋

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {MustContainKeyValidator.class})
public @interface MustContainKey {

    //默認錯誤信息
    String message() default "必須含有指定關(guān)鍵字";
 
   //分組
    Class<?>[] groups() default {};

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

2、真正的校驗者類,實現(xiàn) ConstraintValidator 接口

public class MustContainKeyValidator implements ConstraintValidator<MustContainKey,String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (!StringUtils.isEmpty(value) && !value.contains("京A")) {
            // 獲取默認提示消息
            String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate();
            System.out.println(defaultConstraintMessageTemplate);

            // 禁用默認提示信息
            // context.disableDefaultConstraintViolation();

            //設(shè)置提示語
            // context.buildConstraintViolationWithTemplate("must contain key").addConstraintViolation();

            return false;
        }
        return true;
    }
}

3、在實體類的屬性上添加該注釋

@Data
public class User {

    @NotNull(message = "更新數(shù)據(jù)時,主鍵id不能為空", groups = Update.class)
    private Integer id;

    @NotEmpty(message = "用戶名不能為空")
    private String userName;
    
    private Integer age;

    @NotNull(message = "用戶密碼不能為空")
    @Size(min = 5, max = 10,message = "密碼長度必須是5-10個字符")
    private String password;

    @Valid
    private List<Car> cars;
}


@Data
public class Car {
    
    @MustContainKey
    @NotNull(message = "車牌號碼不能為空")
    private String plateCode; 

    @NotNull(message = "車牌顏色不能為空")
    private String plateColor;
}

4、測試

【請求URL】:http://192.168.1.7:27100/user/saveUserInfo
【請求方式】:POST
【請求參數(shù)】:
{
        
    "userName": "李四",
    "password": "123456",
    "cars": [
        {
            "plateCode": "京A0001",
            "plateColor": "1"
        },
        {
            "plateCode": "浙C0002",
            "plateColor": "2"
        }
    ]
}
【執(zhí)行結(jié)果】:
{
     "code": 2,
     "message": "非法參數(shù)",
     "data": "必須含有指定關(guān)鍵字"
}

以上就是所有關(guān)于 Spring Validation 的介紹,感興趣的同學(xué)歡迎點贊+收藏!文章來源地址http://www.zghlxwxcb.cn/news/detail-472158.html

Spring Validation 接口入?yún)⑿r? referrerpolicy=

到了這里,關(guān)于Spring Validation 接口入?yún)⑿r灥奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 完美實現(xiàn)校驗:利用Spring Validation實現(xiàn)強大的輸入驗證

    校驗例子 大家平時編碼中經(jīng)常涉及參數(shù)的校驗,對于一個用戶注冊的方法來說會校驗用戶名密碼信息: 上述例子中需要手動編寫參數(shù)校驗邏輯的過程。雖然對于這個簡單的示例而言,手動編寫校驗邏輯可能是可行的,但是對于復(fù)雜的驗證規(guī)則和多個參數(shù)的情況,手動編寫校

    2024年01月20日
    瀏覽(16)
  • spring6-國際化:i18n | 數(shù)據(jù)校驗:Validation

    spring6-國際化:i18n | 數(shù)據(jù)校驗:Validation

    1.1、i18n概述 國際化也稱作i18n,其來源是英文單詞 internationalization的首末字符i和n,18為中間的字符數(shù)。由于軟件發(fā)行可能面向多個國家,對于不同國家的用戶,軟件顯示不同語言的過程就是國際化。通常來講,軟件中的國際化是通過配置文件來實現(xiàn)的,假設(shè)要支撐兩種語言,

    2024年02月08日
    瀏覽(25)
  • Springboot實現(xiàn)優(yōu)雅的參數(shù)校驗(Spring Validation)和 if else說再見

    Springboot實現(xiàn)優(yōu)雅的參數(shù)校驗(Spring Validation)和 if else說再見

    當(dāng)我們想提供可靠的 API 接口,對參數(shù)的校驗,以保證最終數(shù)據(jù)入庫的正確性,是 必不可少 的活。比如下圖就是 我們一個項目里 新增一個菜單校驗 參數(shù)的函數(shù),寫了一大堆的 if else 進行校驗,非常的不優(yōu)雅,比起枯燥的CRUD來說,參數(shù)校驗更是枯燥。這只是一個創(chuàng)建菜單的

    2023年04月15日
    瀏覽(20)
  • 一起學(xué)SF框架系列5.11-spring-beans-數(shù)據(jù)校驗validation

    一起學(xué)SF框架系列5.11-spring-beans-數(shù)據(jù)校驗validation

    ????在日常的項目開發(fā)中,應(yīng)用在執(zhí)行業(yè)務(wù)邏輯之前,為了防止非法參數(shù)對業(yè)務(wù)造成的影響,必須通過校驗保證傳入數(shù)據(jù)是合法正確的,但很多時候同樣的校驗出現(xiàn)了多次,在不同的層,不同的方法上,導(dǎo)致代碼冗余,違反DRY原則。 ????Java提供了數(shù)據(jù)校驗規(guī)范來解

    2024年02月15日
    瀏覽(13)
  • 【Spring框架】--04.單元測試JUnit、事務(wù)、資源操作Resources、國際化、數(shù)據(jù)校驗Validation、提前編譯AOT

    【Spring框架】--04.單元測試JUnit、事務(wù)、資源操作Resources、國際化、數(shù)據(jù)校驗Validation、提前編譯AOT

    學(xué)習(xí)視頻: 尚硅谷Spring教程 在之前的測試方法中,幾乎都能看到以下的兩行代碼: 這兩行代碼的作用是創(chuàng)建Spring容器,最終獲取到對象,但是每次測試都需要重復(fù)編寫。針對上述問題,我們需要的是程序能自動幫我們創(chuàng)建容器。我們都知道JUnit無法知曉我們是否使用了 Spr

    2024年02月12日
    瀏覽(23)
  • Spring Boot中使用validator如何實現(xiàn)接口入?yún)⒆詣訖z驗

    Spring Boot中使用validator如何實現(xiàn)接口入?yún)⒆詣訖z驗

    在項目開發(fā)過程中,經(jīng)常會對一些字段進行校驗,比如字段的非空校驗、字段的長度校驗等,如果在每個需要的地方寫一堆if else 會讓你的代碼變的冗余笨重且相對不好維護,如何更加規(guī)范和優(yōu)雅的校驗?zāi)兀?Spring Boot中可以使用Validation Api和Hibernate Validator實現(xiàn)接口入?yún)⒆詣訖z

    2024年02月12日
    瀏覽(24)
  • java使用Validation進行數(shù)據(jù)校驗

    在開發(fā)中,我們經(jīng)常遇到參數(shù)校驗的需求,比如用戶注冊的時候,要校驗用戶名不能為空、用戶名長度不超過20個字符、手機號是合法的手機號格式等等。如果使用普通方式,我們會把校驗的代碼和真正的業(yè)務(wù)處理邏輯耦合在一起,而且如果未來要新增一種校驗邏輯也需要在

    2024年02月06日
    瀏覽(20)
  • java的validation框架(參數(shù)校驗)

    java的validation框架(參數(shù)校驗)

    空值校驗類:@Null,@NotNull,@NotEmpty,@NotBlank等 范圍校驗類:@Min,@Size,@Digits,@Future,@Negative等 其它校驗類:@Email,@URL,@AssertTrue,@Pattern等 1. @NotNull(message = “用戶id不能為空”) 沒有設(shè)置值時會返回 設(shè)置為userInfo.setUserId(\\\"\\\");時不會返回 userInfo.setUserId(\\\" \\\");時不會返回 2.@Not

    2024年01月22日
    瀏覽(30)
  • 身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)

    身份證號碼,格式校驗:@IdCard(Validation + 原生實現(xiàn)校驗邏輯)

    自定義一個用于校驗 身份證號碼 格式的注解 @IdCard ,能夠和現(xiàn)有的 Validation 參數(shù)校驗機制兼容,使用方式和其他校驗注解保持一致(使用 @Valid 注解接口參數(shù))。 本文使用原生方式實現(xiàn)校驗邏輯,校驗規(guī)則的實現(xiàn)較為基礎(chǔ);Hutool工具提供了更加完善的校驗工具,可以考慮使

    2024年02月07日
    瀏覽(98)
  • 文件導(dǎo)入之Validation校驗List對象數(shù)組

    文件導(dǎo)入之Validation校驗List對象數(shù)組

    背景: 我們的接口是一個List對象,對象里面的數(shù)據(jù)基本都有一些基礎(chǔ)數(shù)據(jù)校驗的注解,我們怎么樣才能校驗這些基礎(chǔ)規(guī)則呢? 我們在導(dǎo)入excel文件進行數(shù)據(jù)錄入的時候,數(shù)據(jù)錄入也有基礎(chǔ)的校驗規(guī)則,這個時候我們又該如何少寫代碼讓Validation框架來幫我們完成這些基礎(chǔ)校驗

    2024年02月09日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包