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

關(guān)于javax.validation.constraints的超詳細(xì)說(shuō)明

 更新時(shí)間:2025年07月03日 09:41:24   投稿:daisy  
這篇文章主要給大家介紹了關(guān)于javax.validation.constraints的超詳細(xì)說(shuō)明,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

以下是關(guān)于 javax.validation.constraints(現(xiàn)為 ?Jakarta Bean Validation)的詳細(xì)說(shuō)明,涵蓋核心注解、使用場(chǎng)景、代碼示例及最佳實(shí)踐:

一、javax.validation.constraints 是什么?

  • ?作用?:提供一組標(biāo)準(zhǔn)注解,用于對(duì) Java Bean 的字段或方法參數(shù)進(jìn)行數(shù)據(jù)校驗(yàn)(如非空、長(zhǎng)度、范圍等)。
  • ?規(guī)范演進(jìn)?:
    • Java EE 時(shí)期:包名為 javax.validation.constraints。
    • Jakarta EE 9+:包名遷移為 jakarta.validation.constraints(需注意依賴兼容性)。

二、核心注解列表及用法

1. 常用注解

?注解??校驗(yàn)規(guī)則??支持類(lèi)型?
@NotNull值不能為 null任意類(lèi)型
@NotBlank字符串不能為空或純空格String
@NotEmpty集合/數(shù)組/字符串不能為空(長(zhǎng)度 > 0)CollectionString 等
@Size(min, max)元素?cái)?shù)量或字符串長(zhǎng)度在指定范圍內(nèi)集合、數(shù)組、字符串
@Min(value)數(shù)值必須 ≥ 指定最小值數(shù)值類(lèi)型(intlong 等)
@Max(value)數(shù)值必須 ≤ 指定最大值同上
@DecimalMin(value)數(shù)值必須 ≥ 指定最小值(字符串形式,支持精度)BigDecimalString 等
@DecimalMax(value)數(shù)值必須 ≤ 指定最大值(字符串形式,支持精度)同上
@Digits(integer, fraction)數(shù)值整數(shù)部分最多 integer 位,小數(shù)部分最多 fraction 位數(shù)值類(lèi)型
@Pattern(regexp)字符串必須匹配正則表達(dá)式String
@Email字符串必須是合法郵箱格式String
@Positive / @PositiveOrZero數(shù)值必須為正數(shù)或零數(shù)值類(lèi)型
@Negative / @NegativeOrZero數(shù)值必須為負(fù)數(shù)或零數(shù)值類(lèi)型
@Future / @FutureOrPresent日期必須在未來(lái)(或包含當(dāng)前)DateLocalDate 等
@Past / @PastOrPresent日期必須在過(guò)去(或包含當(dāng)前)同上

2. 注解示例代碼

public class User {
    @NotBlank(message = "用戶名不能為空")
    private String username;

    @Email(message = "郵箱格式無(wú)效")
    private String email;

    @Size(min = 6, max = 20, message = "密碼長(zhǎng)度需在6-20位之間")
    private String password;

    @Min(value = 18, message = "年齡必須≥18歲")
    @Max(value = 100, message = "年齡必須≤100歲")
    private Integer age;

    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手機(jī)號(hào)格式無(wú)效")
    private String phone;
}

三、集成到 Spring Boot 中的步驟

1. 添加依賴

<!-- Spring Boot 2.x 使用 javax.validation -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<!-- Jakarta EE 9+ 使用 jakarta.validation -->
<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>3.0.2</version>
</dependency>

2. 在 Controller 中觸發(fā)校驗(yàn)

使用 @Valid 或 @Validated 注解觸發(fā)校驗(yàn):

@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody @Valid User user) {
    // 校驗(yàn)通過(guò)后執(zhí)行業(yè)務(wù)邏輯
    return ResponseEntity.ok("用戶創(chuàng)建成功");
}

3. 處理校驗(yàn)異常

通過(guò) @ExceptionHandler 捕獲 MethodArgumentNotValidException

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach(error -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return ResponseEntity.badRequest().body(errors);
    }
}

四、高級(jí)用法

1. 分組校驗(yàn)

通過(guò)分組接口實(shí)現(xiàn)不同場(chǎng)景下的差異化校驗(yàn):

// 定義分組接口
public interface CreateGroup {}
public interface UpdateGroup {}

public class User {
    @NotNull(groups = UpdateGroup.class)
    private Long id;

    @NotBlank(groups = {CreateGroup.class, UpdateGroup.class})
    private String name;
}

// 在 Controller 中指定分組
@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody @Validated(CreateGroup.class) User user) { ... }

2. 自定義校驗(yàn)注解

實(shí)現(xiàn)自定義校驗(yàn)邏輯(如密碼強(qiáng)度校驗(yàn)):

@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface StrongPassword {
    String message() default "密碼必須包含大小寫(xiě)字母和數(shù)字";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class PasswordValidator implements ConstraintValidator<StrongPassword, String> {
    @Override
    public boolean isValid(String password, ConstraintValidatorContext context) {
        return password.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).+$");
    }
}

3. 級(jí)聯(lián)校驗(yàn)

校驗(yàn)對(duì)象內(nèi)的嵌套對(duì)象:

public class Order {
    @Valid
    private List<@Valid Product> products; // 校驗(yàn)每個(gè) Product 的字段
}

五、校驗(yàn)失敗的錯(cuò)誤消息定制

1. 默認(rèn)消息模板

每個(gè)注解的 message 屬性支持占位符:

@Size(min = 6, max = 20, message = "密碼長(zhǎng)度需在{min}-{max}位之間")
private String password;

2. 國(guó)際化消息

在 messages.properties 或 ValidationMessages.properties 中定義:

user.email.invalid=郵箱格式無(wú)效

注解中使用:

@Email(message = "{user.email.invalid}")
private String email;

六、常見(jiàn)問(wèn)題與解決方案

?問(wèn)題??解決方案?
校驗(yàn)未生效檢查是否添加了 @Valid 或 @Validated 注解;確認(rèn)依賴已正確引入
嵌套對(duì)象校驗(yàn)失敗在嵌套對(duì)象字段上添加 @Valid 注解
分組校驗(yàn)不生效在 @Validated 注解中明確指定分組接口
自定義校驗(yàn)器未觸發(fā)確認(rèn) @Constraint(validatedBy = MyValidator.class) 并實(shí)現(xiàn) ConstraintValidator

七、總結(jié)

  • ?核心價(jià)值?:通過(guò)聲明式注解簡(jiǎn)化數(shù)據(jù)校驗(yàn)邏輯,減少樣板代碼。
  • ?最佳實(shí)踐?:
    • 優(yōu)先使用標(biāo)準(zhǔn)注解,避免重復(fù)造輪子。
    • 結(jié)合分組校驗(yàn)實(shí)現(xiàn)多場(chǎng)景復(fù)用。
    • 統(tǒng)一處理校驗(yàn)異常,返回清晰的錯(cuò)誤信息。
  • ?擴(kuò)展性?:通過(guò)自定義注解和校驗(yàn)器滿足復(fù)雜業(yè)務(wù)需求。

到此這篇關(guān)于關(guān)于javax.validation.constraints超詳細(xì)說(shuō)明的文章就介紹到這了,更多相關(guān)javax.validation.constraints說(shuō)明內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java8新特性之Optional的深入解析

    java8新特性之Optional的深入解析

    這篇文章主要給大家介紹了關(guān)于java8新特性之Optional的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Java利用深度搜索解決數(shù)獨(dú)游戲詳解

    Java利用深度搜索解決數(shù)獨(dú)游戲詳解

    數(shù)獨(dú)是一項(xiàng)非常簡(jiǎn)單的任務(wù)。玩家需要根據(jù)9×9盤(pán)面上的已知數(shù)字,推理出所有剩余空格的數(shù)字,并滿足每一行、每一列、每一個(gè)粗線宮(3*3)內(nèi)的數(shù)字均含1-9,不重復(fù)。本文將利用Java編寫(xiě)一個(gè)程序來(lái)解決給定的數(shù)獨(dú)任務(wù),感興趣的可以動(dòng)手嘗試一下
    2022-08-08
  • POI XSSFSheet shiftRows bug問(wèn)題解決

    POI XSSFSheet shiftRows bug問(wèn)題解決

    這篇文章主要介紹了POI XSSFSheet shiftRows bug問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java編程實(shí)現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例

    Java編程實(shí)現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)深度優(yōu)先遍歷與連通分量代碼示例,
    2017-11-11
  • SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例

    SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例

    這篇文章主要介紹了SpringBoot基于Shiro處理ajax請(qǐng)求代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java動(dòng)態(tài)替換properties文件中鍵值方式

    Java動(dòng)態(tài)替換properties文件中鍵值方式

    這篇文章主要介紹了Java動(dòng)態(tài)替換properties文件中鍵值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳解ArrayList的擴(kuò)容機(jī)制

    詳解ArrayList的擴(kuò)容機(jī)制

    ArrayList基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),在添加和刪除的時(shí)候存在擴(kuò)容和縮容這樣重新規(guī)劃數(shù)組大小的機(jī)制。在ArrayList中,維護(hù)Object[] elementData數(shù)組來(lái)管理元素,但是ArrayList是動(dòng)態(tài)可變的,所以elementData數(shù)組長(zhǎng)度并不代表ArrayList實(shí)際元素個(gè)數(shù),所以使用size顯示實(shí)際元素個(gè)數(shù)
    2021-06-06
  • 詳解java 對(duì)象鎖與類(lèi)鎖

    詳解java 對(duì)象鎖與類(lèi)鎖

    這篇文章主要介紹了java 對(duì)象鎖與類(lèi)鎖的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Maven中設(shè)置阿里云鏡像的全流程

    Maven中設(shè)置阿里云鏡像的全流程

    在Maven項(xiàng)目中,配置阿里云鏡像可以顯著提高依賴下載的速度和穩(wěn)定性,以下是詳細(xì)步驟,包括準(zhǔn)備工作、修改settings.xml文件、驗(yàn)證配置以及實(shí)際案例和示例代碼,通過(guò)這些步驟,你可以輕松地將Maven配置為使用國(guó)內(nèi)的鏡像源
    2025-02-02
  • Java內(nèi)部類(lèi)的繼承(全)

    Java內(nèi)部類(lèi)的繼承(全)

    這篇文章主要介紹了Java內(nèi)部類(lèi)的繼承,大家都知道JAVA內(nèi)部類(lèi)的構(gòu)造器必須連接指向其外圍類(lèi)對(duì)象的引用,所以在繼承內(nèi)部類(lèi)的時(shí)候,需要在導(dǎo)出類(lèi)的構(gòu)造器中手動(dòng)加入對(duì)基類(lèi)構(gòu)造器的調(diào)用,需要的朋友可以參考下
    2015-07-07

最新評(píng)論