欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java參數(shù)校驗Validator與@AssertTrue深度解析

 更新時間:2025年01月10日 09:51:53   作者:訾博ZiBo  
本文詳細介紹了Java的Validator框架及其@AssertTrue注解的使用,包括環(huán)境準備、基礎(chǔ)注解介紹、實戰(zhàn)示例、@AssertTrue的深入解析、高級特性和最佳實踐建議,感興趣的朋友跟隨小編一起看看吧

Java參數(shù)校驗最佳實踐:Validator與@AssertTrue深度解析

1. 引言

在企業(yè)級應用開發(fā)中,參數(shù)校驗是保證數(shù)據(jù)質(zhì)量的第一道防線。本文將深入介紹Java的Validator框架的使用,特別是如何結(jié)合@AssertTrue注解實現(xiàn)復雜的業(yè)務校驗邏輯。

2. 環(huán)境準備

2.1 依賴配置

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.1.5.Final</version>
</dependency>

3. 基礎(chǔ)注解介紹

常用的校驗注解包括:

  • @NotBlank: 字符串不能為null且去除空格后長度必須大于0
  • @Pattern: 通過正則表達式校驗字符串格式
  • @Size: 校驗字符串、集合、數(shù)組等的長度范圍
  • @AssertTrue: 校驗方法返回值必須為true
  • @NotNull: 不能為null
  • @Min: 數(shù)值必須大于等于指定值
  • @Max: 數(shù)值必須小于等于指定值
  • @Email: 校驗郵箱格式

4. 實戰(zhàn)示例

4.1 請求對象定義

@Data
public class ImageRequest {
    /**
     * 圖片URL地址
     */
    @Pattern(regexp = "^(http|https)://.*", message = "圖片URL格式不正確")
    @Size(max = 1024, message = "圖片URL長度不能超過1024個字符")
    private String imageUrl;
    /**
     * Base64編碼的圖片數(shù)據(jù)
     */
    @Size(max = 10 * 1024 * 1024, message = "Base64圖片數(shù)據(jù)不能超過10MB")
    private String base64Image;
    /**
     * 設(shè)備編號
     */
    @NotBlank(message = "設(shè)備編號不能為空")
    private String deviceNo;
    /**
     * 用戶標識
     */
    @NotBlank(message = "用戶標識不能為空")
    private String userId;
    /**
     * 自定義校驗方法:確保至少提供一種圖片數(shù)據(jù)
     */
    @AssertTrue(message = "必須提供圖片URL或Base64編碼圖片數(shù)據(jù)其中之一")
    public boolean isImageDataValid() {
        return StringUtils.isNotBlank(imageUrl) || StringUtils.isNotBlank(base64Image);
    }
}

4.2 校驗實現(xiàn)

public class ValidationExample {
    private final Validator validator;
    public ValidationExample() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        this.validator = factory.getValidator();
    }
    public void validateRequest(ImageRequest request) {
        // 執(zhí)行校驗
        Set<ConstraintViolation<ImageRequest>> violations = validator.validate(request);
        // 如果存在校驗錯誤
        if (!violations.isEmpty()) {
            // 收集所有驗證錯誤信息
            String errorMessage = violations.stream()
                    .map(ConstraintViolation::getMessage)
                    .collect(Collectors.joining("; "));
            log.error("參數(shù)校驗失?。簕}", errorMessage);
            throw new IllegalArgumentException("參數(shù)校驗失?。? + errorMessage);
        }
    }
}

5. @AssertTrue深入解析

5.1 基本用法

@AssertTrue注解用于復雜的業(yè)務校驗場景,特別是涉及多個字段之間的關(guān)聯(lián)校驗時。

5.2 命名規(guī)范

@AssertTrue(message = "校驗失敗的提示信息")
public boolean isXxxValid() {
    // 校驗邏輯
    return true/false;
}

5.3 常見使用場景

5.3.1 互斥字段校驗

@AssertTrue(message = "付款方式只能選擇其中一種")
public boolean isPaymentMethodValid() {
    return (alipay != null) ^ (wechatPay != null);
}

5.3.2 依賴字段校驗

@AssertTrue(message = "當選擇快遞配送時,收貨地址不能為空")
public boolean isDeliveryAddressValid() {
    return !DeliveryType.EXPRESS.equals(deliveryType) || 
           StringUtils.isNotBlank(deliveryAddress);
}

5.3.3 數(shù)值范圍聯(lián)動校驗

@AssertTrue(message = "結(jié)束時間必須晚于開始時間")
public boolean isTimeRangeValid() {
    return endTime != null && startTime != null && 
           endTime.after(startTime);
}

6. 高級特性

6.1 分組校驗

public interface Create {}
public interface Update {}
@AssertTrue(message = "創(chuàng)建時的校驗規(guī)則", groups = {Create.class})
public boolean isCreateValid() {
    return ...;
}
@AssertTrue(message = "更新時的校驗規(guī)則", groups = {Update.class})
public boolean isUpdateValid() {
    return ...;
}

6.2 組合校驗規(guī)則

@AssertTrue(message = "圖片數(shù)據(jù)格式校驗失敗")
public boolean isImageFormatValid() {
    if (StringUtils.isNotBlank(imageUrl)) {
        return imageUrl.startsWith("http") && 
               (imageUrl.endsWith(".jpg") || imageUrl.endsWith(".png"));
    }
    if (StringUtils.isNotBlank(base64Image)) {
        return base64Image.startsWith("data:image/");
    }
    return false;
}

7. 最佳實踐建議

統(tǒng)一異常處理

  • 創(chuàng)建全局異常處理器
  • 統(tǒng)一校驗失敗的返回格式

性能優(yōu)化

  • ValidatorFactory應該是單例的
  • 避免在校驗方法中進行重量級操作

代碼規(guī)范

  • 校驗方法命名要規(guī)范且具有描述性
  • 保持校驗邏輯的簡單清晰

且具有描述性保持校驗邏輯的簡單清晰

測試覆蓋

  • 編寫完整的單元測試
  • 覆蓋各種邊界條件

文檔維護

  • 記錄校驗規(guī)則的業(yè)務含義
  • 及時更新文檔

到此這篇關(guān)于Java參數(shù)校驗Validator與@AssertTrue深度解析的文章就介紹到這了,更多相關(guān)java參數(shù)校驗Validator與@AssertTrue內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中結(jié)束循環(huán)的方法

    Java中結(jié)束循環(huán)的方法

    這篇文章主要介紹了Java中結(jié)束循環(huán)的方法,文中有段代碼在return,結(jié)束了整個main方法,即使輸出hello world的語句位于循環(huán)體外,也不會被執(zhí)行,對java結(jié)束循環(huán)方法感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • docusaurus如何添加一個搜索功能

    docusaurus如何添加一個搜索功能

    這篇文章主要介紹了docusaurus如何添加一個搜索功能,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Springboot+ElementUi實現(xiàn)評論、回復、點贊功能

    Springboot+ElementUi實現(xiàn)評論、回復、點贊功能

    這篇文章主要介紹了通過Springboot ElementUi實現(xiàn)評論、回復、點贊功能。如果是自己評論的還可以刪除,刪除的規(guī)則是如果該評論下還有回復,也一并刪除。需要的可以參考一下
    2022-01-01
  • Spring核心容器之Bean創(chuàng)建過程詳解

    Spring核心容器之Bean創(chuàng)建過程詳解

    這篇文章主要介紹了Spring核心容器之Bean創(chuàng)建過程詳解,獲取?Bean?的方法是?getBean,其來自?BeanFactory?繼承的AbstractAutowireCapableBeanFactory?抽象類繼承的AbstractBeanFactory?抽象類中,需要的朋友可以參考下
    2023-11-11
  • 關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置方法,看這篇夠了

    關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置方法,看這篇夠了

    關(guān)于JDK+Tomcat+eclipse+MyEclipse的配置問題,很多朋友都搞不太明白,網(wǎng)上一搜配置方法多種哪種最精簡呢,今天小編給大家分享一篇文章幫助大家快速掌握JDK Tomcat eclipse MyEclipse配置技巧,需要的朋友參考下吧
    2021-06-06
  • SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程

    SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程

    在我們寫項目的時候,我們時常會因為需要創(chuàng)建很多的項目結(jié)構(gòu)而頭疼,本文主要介紹了SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Java ArrayList類的基礎(chǔ)使用講解

    Java ArrayList類的基礎(chǔ)使用講解

    數(shù)組的長度是固定的,無法適應數(shù)據(jù)變化的需求。為了解決這個問題,Java提供了另一個容器 java.util.ArrayList集合類,讓我們可以更便捷的存儲和操作對象數(shù)據(jù)。本文就將通過示例聊聊ArrayList類的基礎(chǔ)使用,感興趣的可以了解一下
    2022-10-10
  • spring task @Scheduled注解各參數(shù)的用法

    spring task @Scheduled注解各參數(shù)的用法

    這篇文章主要介紹了spring task @Scheduled注解各參數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java注解詳解之@Override注解

    Java注解詳解之@Override注解

    這篇文章主要給大家介紹了關(guān)于Java注解之@Override注解的相關(guān)資料,@Override是Java中的一個注解,表示一個方法是重寫(Override)了父類中的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • SpringBoot中如何進行全局異常處理方式

    SpringBoot中如何進行全局異常處理方式

    在SpringBoot開發(fā)過程中,全局異常處理能提高程序的魯棒性并降低代碼耦合,通過使用@RestControllerAdvice和@ExceptionHandler注解,可以實現(xiàn)對程序異常的全局攔截和處理,首先需要自定義一個繼承自ResponseEntityExceptionHandler的異常處理類
    2024-11-11

最新評論