最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?JDK?Validation?注解解析與使用方法驗(yàn)證

 更新時(shí)間:2025年09月25日 11:32:01   作者:Full?Stack?Developme  
Jakarta?Validation提供了一種聲明式、標(biāo)準(zhǔn)化的方式來(lái)驗(yàn)證Java對(duì)象,與框架無(wú)關(guān),可以方便地集成到各種Java應(yīng)用中,本文給大家介紹Java?JDK?Validation?注解解析與使用,感興趣的朋友一起看看吧

Jakarta Validation(原 JSR-380,也稱為 Bean Validation 2.0)是 Java 中用于驗(yàn)證對(duì)象數(shù)據(jù)的標(biāo)準(zhǔn) API。

它提供了一套注解和接口,用于聲明和執(zhí)行驗(yàn)證規(guī)則。

位于 jakarta.validation。

核心概念

1. 主要注解

基本約束注解

注解作用
@NotNull驗(yàn)證值不為 null
@Null驗(yàn)證值必須為 null
@AssertTrue驗(yàn)證布爾值為 true
@AssertFalse驗(yàn)證布爾值為 false
@Min(value)驗(yàn)證數(shù)字不小于指定值
@Max(value)驗(yàn)證數(shù)字不大于指定值
@DecimalMin(value)驗(yàn)證數(shù)字不小于指定值(字符串形式)
@DecimalMax(value)驗(yàn)證數(shù)字不大于指定值(字符串形式)
@Size(min, max)驗(yàn)證集合/數(shù)組/字符串大小在范圍內(nèi)
@Digits(integer, fraction)驗(yàn)證數(shù)字格式
@Past驗(yàn)證日期是過去的
@PastOrPresent驗(yàn)證日期是過去或現(xiàn)在
@Future驗(yàn)證日期是將來(lái)的
@FutureOrPresent驗(yàn)證日期是將來(lái)或現(xiàn)在
@Pattern(regex)驗(yàn)證字符串匹配正則表達(dá)式
@Email驗(yàn)證字符串是有效的電子郵件格式

其他常用注解

注解作用
@Valid級(jí)聯(lián)驗(yàn)證對(duì)象中的屬性
@NotEmpty驗(yàn)證字符串/集合不為 null 且不為空
@NotBlank驗(yàn)證字符串不為 null 且至少包含一個(gè)非空白字符
@Positive驗(yàn)證數(shù)字為正數(shù)
@PositiveOrZero驗(yàn)證數(shù)字為正數(shù)或零
@Negative驗(yàn)證數(shù)字為負(fù)數(shù)
@NegativeOrZero驗(yàn)證數(shù)字為負(fù)數(shù)或零

2. 核心接口

  • Validator: 執(zhí)行驗(yàn)證的主要接口
  • ConstraintValidator: 自定義約束驗(yàn)證器接口
  • ConstraintViolation: 表示驗(yàn)證失敗的結(jié)果
  • ConstraintValidatorContext: 自定義驗(yàn)證器的上下文

使用方法

1. 基本使用

添加依賴 (Maven)

<dependency>
    <groupId>jakarta.validation</groupId>
    <artifactId>jakarta.validation-api</artifactId>
    <version>3.0.2</version>
</dependency>
<!-- 實(shí)現(xiàn) (如 Hibernate Validator) -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>8.0.1.Final</version>
</dependency>

定義驗(yàn)證對(duì)象

public class User {
    @NotNull(message = "用戶名不能為空")
    @Size(min = 3, max = 20, message = "用戶名長(zhǎng)度必須在3-20之間")
    private String username;
    @Email(message = "郵箱格式不正確")
    private String email;
    @Min(value = 18, message = "年齡必須大于18歲")
    private int age;
    // getters and setters
}

執(zhí)行驗(yàn)證

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
User user = new User();
user.setUsername("ab"); // 太短
user.setEmail("invalid-email");
user.setAge(17);
Set<ConstraintViolation<User>> violations = validator.validate(user);
for (ConstraintViolation<User> violation : violations) {
    System.out.println(violation.getPropertyPath() + ": " + violation.getMessage());
}

2. 在 Spring Boot 中使用

Spring Boot 自動(dòng)集成了 Bean Validation,可以直接使用:

控制器驗(yàn)證

@RestController
@RequestMapping("/users")
public class UserController {
    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody User user) {
        // 如果驗(yàn)證失敗,會(huì)拋出MethodArgumentNotValidException
        return ResponseEntity.ok("用戶創(chuàng)建成功");
    }
}

全局異常處理

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationExceptions(
        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);
    }
}

3. 自定義驗(yàn)證注解

定義注解

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneNumberValidator.class)
public @interface PhoneNumber {
    String message() default "無(wú)效的電話號(hào)碼";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

實(shí)現(xiàn)驗(yàn)證器

public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true; // 使用@NotNull處理null值
        }
        return PHONE_PATTERN.matcher(value).matches();
    }
}

使用自定義注解

public class ContactInfo {
    @PhoneNumber
    private String phone;
    // getter and setter
}

高級(jí)特性

1. 分組驗(yàn)證

public interface BasicInfo {}
public interface AdvancedInfo {}
public class User {
    @NotNull(groups = BasicInfo.class)
    private String username;
    @Email(groups = AdvancedInfo.class)
    private String email;
}
// 使用分組驗(yàn)證
Set<ConstraintViolation<User>> violations = validator.validate(user, BasicInfo.class);

2. 級(jí)聯(lián)驗(yàn)證

public class Order {
    @Valid
    private List<OrderItem> items;
}
public class OrderItem {
    @NotNull
    private String productId;
    @Min(1)
    private int quantity;
}

3. 自定義消息

可以使用表達(dá)式和EL表達(dá)式:

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

4. 方法驗(yàn)證

驗(yàn)證方法參數(shù)和返回值:

public class UserService {
    @Validated
    public void createUser(@Valid User user) {
        // ...
    }
    @Valid
    public User getUser(@NotNull Long id) {
        // ...
    }
}

最佳實(shí)踐

  • 合理選擇驗(yàn)證級(jí)別:在DTO層進(jìn)行基本驗(yàn)證,在業(yè)務(wù)層進(jìn)行復(fù)雜驗(yàn)證
  • 使用適當(dāng)?shù)南ⅲ禾峁┣逦?、用戶友好的錯(cuò)誤消息
  • 組合使用注解:如@NotNull + @Size比單獨(dú)使用更安全
  • 避免過度驗(yàn)證:只在必要的地方添加驗(yàn)證
  • 考慮性能:大量驗(yàn)證可能影響性能,特別是在批量操作中

Jakarta Validation 提供了一種聲明式、標(biāo)準(zhǔn)化的方式來(lái)驗(yàn)證Java對(duì)象,與框架無(wú)關(guān),可以方便地集成到各種Java應(yīng)用中。

到此這篇關(guān)于Java JDK Validation 注解解析與使用的文章就介紹到這了,更多相關(guān)Java JDK Validation 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存

    詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存

    本篇文章主要介紹了詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-04-04
  • 深度解析Java中CountDownLatch的原理

    深度解析Java中CountDownLatch的原理

    在高并發(fā)編程中,AbstractQueuedSynchronizer(簡(jiǎn)稱AQS)抽象的隊(duì)列同步器是我們必須掌握的,本文將通過CountDownLatch底層實(shí)現(xiàn)原理來(lái)了解AQS共享鎖模式的實(shí)現(xiàn)原理,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Springboot實(shí)現(xiàn)多線程及線程池監(jiān)控

    Springboot實(shí)現(xiàn)多線程及線程池監(jiān)控

    線程池的監(jiān)控很重要,本文就來(lái)介紹一下Springboot實(shí)現(xiàn)多線程及線程池監(jiān)控,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • springboot整合vue2-uploader實(shí)現(xiàn)文件分片上傳、秒傳、斷點(diǎn)續(xù)傳功能

    springboot整合vue2-uploader實(shí)現(xiàn)文件分片上傳、秒傳、斷點(diǎn)續(xù)傳功能

    對(duì)于大文件的處理,無(wú)論是用戶端還是服務(wù)端,如果一次性進(jìn)行讀取發(fā)送、接收都是不可取,很容易導(dǎo)致內(nèi)存問題,下面這篇文章主要給大家介紹了關(guān)于springboot整合vue2-uploader實(shí)現(xiàn)文件分片上傳、秒傳、斷點(diǎn)續(xù)傳功能的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • 如何使用BigDecimal實(shí)現(xiàn)Java開發(fā)商業(yè)計(jì)算

    如何使用BigDecimal實(shí)現(xiàn)Java開發(fā)商業(yè)計(jì)算

    這篇文章主要介紹了如何使用BigDecimal實(shí)現(xiàn)Java開發(fā)商業(yè)計(jì)算,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java如何判斷時(shí)間段是否交叉重疊

    java如何判斷時(shí)間段是否交叉重疊

    這篇文章主要介紹了java如何判斷時(shí)間段是否交叉重疊問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解SpringBoot如何讓指定的Bean先加載

    詳解SpringBoot如何讓指定的Bean先加載

    這篇文章主要給大家介紹了在 SpringBoot 中如何讓自己的某個(gè)指定的 Bean 在其他 Bean 前完成被 Spring 加載,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • JAVA實(shí)現(xiàn)圖書管理系統(tǒng)項(xiàng)目

    JAVA實(shí)現(xiàn)圖書管理系統(tǒng)項(xiàng)目

    相信每一個(gè)學(xué)生學(xué)編程的時(shí)候,應(yīng)該都會(huì)寫一個(gè)小項(xiàng)目——圖書管理系統(tǒng)。為什么這么說呢?我認(rèn)為一個(gè)學(xué)校的氛圍很大一部分可以從圖書館的氛圍看出來(lái),而圖書管理系統(tǒng)這個(gè)不大不小的項(xiàng)目,接觸的多,也比較熟悉,不會(huì)有陌生感,能夠練手,又有些難度,所以我的小項(xiàng)目也來(lái)了
    2021-10-10
  • 淺析Java中clone()方法淺克隆與深度克隆

    淺析Java中clone()方法淺克隆與深度克隆

    Java克隆(Clone)是Java語(yǔ)言的特性之一,本篇文章主要介紹了Java中的Clone機(jī)制是如何工作的,需要的朋友可以參考下
    2017-04-04

最新評(píng)論

保德县| 夏河县| 嘉荫县| 南开区| 黄浦区| 六安市| 崇文区| 兴仁县| 盐城市| 嵩明县| 芦溪县| 延边| 宣化县| 洪泽县| 蓝田县| 文成县| 霞浦县| 富蕴县| 平谷区| 星座| 阿拉尔市| 杭锦旗| 额济纳旗| 沧源| 黄龙县| 湘潭市| 龙海市| 连南| 曲阜市| 扶沟县| 河北省| 内江市| 开封县| 勃利县| 来安县| 兴仁县| 辉南县| 广南县| 定襄县| 大连市| 弋阳县|