成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

更強大!Spring Boot 3.4 配置校驗新特性全解鎖

開發 前端
在 Spring Boot 3.4 中,配置屬性的驗證機制得到了顯著增強,讓開發者可以更優雅地保證配置正確性。本文將結合完整示例,詳細講解其新特性及如何自定義錯誤提示,讓啟動校驗體驗更加絲滑!

在 Spring Boot 3.4 中,配置屬性的驗證機制得到了顯著增強,讓開發者可以更優雅地保證配置正確性。本文將結合完整示例,詳細講解其新特性及如何自定義錯誤提示,讓啟動校驗體驗更加絲滑!

配置屬性驗證增強亮點

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

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

可以說,從易用性到嚴謹性,都有了質的飛躍!

基本用法示例

定義配置類

以用戶配置為例:

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位數字")
        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"

注入使用

在你的服務中注入:

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());
    }
}

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

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

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

啟動階段即校驗失敗

如果配置不符合要求,比如漏填 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: 郵箱格式不正確

非常直觀,能第一時間發現配置問題,避免服務上線后隱患!

開發時元信息增強

配合 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 標準注解(Spring Boot 3.x 默認使用 Jakarta)

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

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

定義友好的異常類

package com.icoderoad.demo.exception;


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


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

編寫異常處理器

通過 BeanFactoryPostProcessor 統一攔截配置階段的校驗錯誤:

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 {
                // 手動觸發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位數字; 角色名稱不能為空
  • 信息集中、簡潔直觀
  • 一次性列出所有問題,快速修復
  • 適合前后端、測試同事快速理解

總結

Spring Boot 3.4 配置屬性驗證:

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

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

責任編輯:武曉燕 來源: 路條編程
相關推薦

2018-05-30 15:10:24

Spring BootList類型

2025-04-28 04:55:00

2025-04-28 03:00:00

2025-04-16 10:03:40

開發Spring應用程序

2025-04-27 04:00:00

錯誤頁Spring底層

2009-06-04 17:24:29

EJB3.1新特性Time服務

2009-04-08 08:41:42

Iphone移動OS

2025-03-27 08:10:19

Spring開發架構

2018-06-06 14:30:38

Spring BootApplication事件

2022-11-08 07:46:28

record類聲明代碼

2025-02-17 04:00:00

SpringDgraph系統

2025-04-27 01:55:44

SpringConfigData配置

2022-10-26 07:14:25

Spring 6Spring業務

2021-11-29 21:42:44

微軟Windows 11Windows

2024-05-31 14:06:55

SpringCDSGraalVM

2009-06-24 09:22:04

Spring2.5新特

2024-12-03 10:46:48

Spring優化開發

2025-02-25 08:00:00

SpringBootLua開發

2012-01-12 16:16:20

Fedora 17特性規劃

2024-10-11 11:32:22

Spring6RSocket服務
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看国产视频 | 久久精品小视频 | 亚洲欧美中文日韩在线v日本 | 日韩三级电影在线看 | 国产精品久久久久免费 | 不卡一区二区三区四区 | 在线观看中文字幕 | 国产成人精品久久二区二区91 | 久久久久久国产一区二区三区 | 久久精品一区二区 | 第一av | 99热.com| 国产精品欧美一区二区 | 国产激情一区二区三区 | 国产乱人伦精品一区二区 | 色精品视频 | av在线视 | 久久中文字幕一区 | 久久国产精品一区二区三区 | 一区二区三区av | 欧美 日韩 国产 一区 | 二区中文 | 视频一区二区中文字幕 | 黄页网址在线观看 | 国产精品影视 | 99精品观看 | 久久国际精品 | 视频一区在线观看 | 国产精品精品久久久 | 日韩α片 | 日韩在线国产精品 | 日韩视频专区 | 亚洲男人天堂 | 成年视频在线观看 | 亚洲成人天堂 | 亚洲精品国产第一综合99久久 | 五月天综合网 | 国产一区免费 | 黄色在线免费观看视频 | 精品国产乱码久久久久久88av | 精品久久影院 |