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

SpringBoot3.4配置校驗新特性的用法詳解

 更新時間:2025年04月29日 14:49:15   作者:星辰聊技術(shù)  
Spring Boot 3.4 對配置校驗支持進(jìn)行了全面升級,這篇文章為大家詳細(xì)介紹了一下它們的具體使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下

配置屬性驗證增強亮點

Spring Boot 3.4 對配置校驗支持進(jìn)行了全面升級,核心亮點包括:

  • 支持 jakarta.validation 全套標(biāo)準(zhǔn)注解(如 @NotNull、@Email、@Pattern 等)
  • 嵌套對象、集合元素 的深度校驗支持
  • 啟動階段校驗失敗,IDE友好提示,快速定位問題
  • 自動生成更完善的開發(fā)時元信息(metadata)

可以說,從易用性到嚴(yán)謹(jǐn)性,都有了質(zhì)的飛躍!

基本用法示例

定義配置類

以用戶配置為例:

package com.icoderoad.demo.config;


import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;


import java.util.List;


@Validated
@ConfigurationProperties(prefix = "app.user")
public class UserProperties {


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


    @Email(message = "郵箱格式不正確")
    private String email;


    @Min(value = 18, message = "年齡不能小于18歲")
    private Integer age;


    @Valid
    private Address address;


    @Size(min = 1, message = "至少需要一個角色")
    private List<@NotBlank(message = "角色名稱不能為空") String> roles;


    // Address是嵌套對象,需要加@Valid
    public static class Address {
        @NotBlank(message = "城市不能為空")
        private String city;


        @Pattern(regexp = "\d{6}", message = "郵編必須是6位數(shù)字")
        private String zipCode;


        // getter/setter
        public String getCity() {
            return city;
        }
        public void setCity(String city) {
            this.city = city;
        }
        public String getZipCode() {
            return zipCode;
        }
        public void setZipCode(String zipCode) {
            this.zipCode = zipCode;
        }
    }


    // getter/setter
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public List<String> getRoles() {
        return roles;
    }
    public void setRoles(List<String> roles) {
        this.roles = roles;
    }
}

配置 application.yml

app:
  user:
    username: "張三"
    email: "zhangsan@example.com"
    age: 25
    address:
      city: "上海"
      zipCode: "200000"
    roles:
      - "admin"
      - "user"

注入使用

在你的服務(wù)中注入:

package com.icoderoad.demo.service;


import com.example.demo.config.UserProperties;
import org.springframework.stereotype.Service;


@Service
public class UserService {


    private final UserProperties userProperties;


    public UserService(UserProperties userProperties) {
        this.userProperties = userProperties;
    }


    public void printUserInfo() {
        System.out.println("用戶名:" + userProperties.getUsername());
        System.out.println("郵箱:" + userProperties.getEmail());
    }
}

嵌套對象與集合元素深度校驗

注意,在嵌套對象上必須標(biāo)注 @Valid,才能對子屬性繼續(xù)校驗。集合元素(如 List<String>)同樣支持元素級校驗注解!

這讓配置類的約束更加細(xì)粒度、安全。

啟動階段即校驗失敗

如果配置不符合要求,比如漏填 username、郵箱格式錯誤、年齡不足18歲、角色列表為空等,Spring Boot 啟動時就會直接報錯!

示例錯誤日志:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target [Bindable@xxx type = com.icoderoad.demo.config.UserProperties] failed:

    Property: app.user.username
    Value: 
    Reason: 用戶名不能為空

    Property: app.user.email
    Value: not-an-email
    Reason: 郵箱格式不正確

非常直觀,能第一時間發(fā)現(xiàn)配置問題,避免服務(wù)上線后隱患!

開發(fā)時元信息增強

配合 Spring Boot 的 spring-boot-configuration-processor 插件,還能自動生成提示補全信息(IDE 中 .yml 配置智能提示)!

pom.xml 配置:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

編譯后,會生成 META-INF/spring-configuration-metadata.json,供 IDE 智能補全參考。

注意事項

  • @ConfigurationProperties 
    必須配合 @Validated
  • 嵌套對象字段要加 @Valid
  • 集合元素校驗,需要在泛型上加注解
  • 使用 Jakarta Validation 標(biāo)準(zhǔn)注解(Spring Boot 3.x 默認(rèn)使用 Jakarta)

擴展:錯誤處理更友好(自定義異常消息格式)

默認(rèn)啟動校驗失敗時,Spring Boot 拋出 BindValidationException,信息雖然完整但略顯雜亂。為了讓錯誤提示更專業(yè)友好,我們可以自定義異常處理。

定義友好的異常類

package com.icoderoad.demo.exception;


/**
 * 自定義配置校驗異常
 */
public class ConfigValidationException extends RuntimeException {


    public ConfigValidationException(String message) {
        super(message);
    }
}

編寫異常處理器

通過 BeanFactoryPostProcessor 統(tǒng)一攔截配置階段的校驗錯誤:

package com.icoderoad.demo.exception;


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.boot.context.properties.bind.BindValidationException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.ObjectError;


import java.util.stream.Collectors;


@Configuration
public class ConfigValidationExceptionHandler {


    @Bean
    public static BeanFactoryPostProcessor configurationPropertiesValidator() {
        return beanFactory -> {
            try {
                // 手動觸發(fā)bean初始化
            } catch (BeansException ex) {
                Throwable cause = ex.getCause();
                if (cause instanceof BindValidationException bindValidationException) {
                    String errorMessages = bindValidationException.getValidationErrors()
                            .getAllErrors()
                            .stream()
                            .map(ObjectError::getDefaultMessage)
                            .collect(Collectors.joining("; "));
                    throw new ConfigValidationException("配置屬性校驗失?。? + errorMessages);
                }
                throw ex;
            }
        };
    }
}

邏輯解釋:

  • 捕獲 BindValidationException
  • 提取所有校驗失敗信息
  • 使用 拼接成簡潔可讀的文本
  • 拋出我們的 ConfigValidationException

示例效果

比如你的配置錯誤如下:

app:
  user:
    username: ""
    email: "wrong"
    age: 15
    address:
      city: ""
      zipCode: "12abc"
    roles:
      - ""

啟動時拋出的錯誤變成:

配置屬性校驗失?。河脩裘荒転榭? 郵箱格式不正確; 年齡不能小于18歲; 城市不能為空; 郵編必須是6位數(shù)字; 角色名稱不能為空

  • 信息集中、簡潔直觀
  • 一次性列出所有問題,快速修復(fù)
  • 適合前后端、測試同事快速理解

總結(jié)

Spring Boot 3.4 配置屬性驗證:

  • 驗證能力更強大覆蓋深度校驗、集合元素校驗
  • 開發(fā)體驗更極致啟動即校驗,IDE智能提示
  • 錯誤處理更優(yōu)雅可自定義異常格式
  • 提升整體代碼質(zhì)量避免配置隱患上線

在實際項目中,推薦配合自定義異常機制,打造更加專業(yè)可靠的配置校驗體系!

到此這篇關(guān)于SpringBoot3.4配置校驗新特性的用法詳解的文章就介紹到這了,更多相關(guān)SpringBoot配置校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Filter中不能注入bean的問題及解決

    在Filter中不能注入bean的問題及解決

    這篇文章主要介紹了在Filter中不能注入bean的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java虛擬機JVM棧溢出的問題解決

    Java虛擬機JVM棧溢出的問題解決

    Java虛擬機棧溢出是指在Java程序中,當(dāng)線程調(diào)用的方法層級過深,導(dǎo)致??臻g溢出的情況,本文就詳細(xì)的介紹了下產(chǎn)生的原因以及優(yōu)化,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • SpringMVC異常處理的三種方式小結(jié)

    SpringMVC異常處理的三種方式小結(jié)

    本文主要介紹了SpringMVC異常處理的三種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • spring boot配合前端實現(xiàn)跨域請求訪問

    spring boot配合前端實現(xiàn)跨域請求訪問

    本篇文章主要介紹了spring boot配合前端實現(xiàn)跨域請求訪問,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲

    Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲

    這篇文章主要為大家詳細(xì)介紹了Java如何基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下
    2022-07-07
  • Java設(shè)計模式之代理模式_動力節(jié)點Java學(xué)院整理

    Java設(shè)計模式之代理模式_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Java設(shè)計模式之代理模式,本文詳細(xì)的介紹了什么事代理模式和相關(guān)的類和接口,有興趣的可以了解一下
    2017-08-08
  • Spring Security整合Oauth2實現(xiàn)流程詳解

    Spring Security整合Oauth2實現(xiàn)流程詳解

    這篇文章主要介紹了Spring Security整合Oauth2實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • Java實現(xiàn)銀行存取款

    Java實現(xiàn)銀行存取款

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)銀行存取款,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java中對象的創(chuàng)建和銷毀過程詳析

    Java中對象的創(chuàng)建和銷毀過程詳析

    這篇文章主要介紹了Java中對象的創(chuàng)建和銷毀過程,對象的創(chuàng)建過程包括類加載檢查、內(nèi)存分配、初始化零值內(nèi)存、設(shè)置對象頭和執(zhí)行init方法,對象的銷毀過程由垃圾回收機制負(fù)責(zé),文中介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • eclipse/IDEA配置javafx項目步驟(圖文教程)

    eclipse/IDEA配置javafx項目步驟(圖文教程)

    這篇文章主要介紹了eclipse/IDEA配置javafx項目步驟(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論