自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

更強(qiáng)大!Spring Boot 3.4 配置校驗(yàn)新特性全解鎖

開發(fā) 前端
在 Spring Boot 3.4 中,配置屬性的驗(yàn)證機(jī)制得到了顯著增強(qiáng),讓開發(fā)者可以更優(yōu)雅地保證配置正確性。本文將結(jié)合完整示例,詳細(xì)講解其新特性及如何自定義錯(cuò)誤提示,讓啟動(dòng)校驗(yàn)體驗(yàn)更加絲滑!

在 Spring Boot 3.4 中,配置屬性的驗(yàn)證機(jī)制得到了顯著增強(qiáng),讓開發(fā)者可以更優(yōu)雅地保證配置正確性。本文將結(jié)合完整示例,詳細(xì)講解其新特性及如何自定義錯(cuò)誤提示,讓啟動(dòng)校驗(yàn)體驗(yàn)更加絲滑!

配置屬性驗(yàn)證增強(qiáng)亮點(diǎn)

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

  • 支持 jakarta.validation 全套標(biāo)準(zhǔn)注解(如 @NotNull、@Email、@Pattern 等)
  • 嵌套對(duì)象、集合元素 的深度校驗(yàn)支持
  • 啟動(dòng)階段校驗(yàn)失敗,IDE友好提示,快速定位問題
  • 自動(dòng)生成更完善的開發(fā)時(shí)元信息(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 = "至少需要一個(gè)角色")
    private List<@NotBlank(message = "角色名稱不能為空") String> roles;


    // Address是嵌套對(duì)象,需要加@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());
    }
}

嵌套對(duì)象與集合元素深度校驗(yàn)

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

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

啟動(dòng)階段即校驗(yàn)失敗

如果配置不符合要求,比如漏填 username、郵箱格式錯(cuò)誤、年齡不足18歲、角色列表為空等,Spring Boot 啟動(dòng)時(shí)就會(huì)直接報(bào)錯(cuò)!

示例錯(cuò)誤日志:

***************************
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: 郵箱格式不正確

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

開發(fā)時(shí)元信息增強(qiáng)

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

pom.xml 配置:

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

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

注意事項(xiàng)

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

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

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

定義友好的異常類

package com.icoderoad.demo.exception;


/**
 * 自定義配置校驗(yàn)異常
 */
public class ConfigValidationException extends RuntimeException {


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

編寫異常處理器

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

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 {
                // 手動(dòng)觸發(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("配置屬性校驗(yàn)失?。? + errorMessages);
                }
                throw ex;
            }
        };
    }
}

邏輯解釋:

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

示例效果

比如你的配置錯(cuò)誤如下:

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

啟動(dòng)時(shí)拋出的錯(cuò)誤變成:

配置屬性校驗(yàn)失?。河脩裘荒転榭? 郵箱格式不正確; 年齡不能小于18歲; 城市不能為空; 郵編必須是6位數(shù)字; 角色名稱不能為空
  • 信息集中、簡(jiǎn)潔直觀
  • 一次性列出所有問題,快速修復(fù)
  • 適合前后端、測(cè)試同事快速理解

總結(jié)

Spring Boot 3.4 配置屬性驗(yàn)證:

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

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

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

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

開發(fā)Spring應(yīng)用程序

2025-04-27 04:00:00

錯(cuò)誤頁Spring底層

2009-06-04 17:24:29

EJB3.1新特性Time服務(wù)

2025-03-27 08:10:19

Spring開發(fā)架構(gòu)

2022-11-08 07:46:28

record類聲明代碼

2018-06-06 14:30:38

Spring BootApplication事件

2025-04-27 01:55:44

SpringConfigData配置

2009-04-08 08:41:42

Iphone移動(dòng)OS

2025-02-17 04:00:00

SpringDgraph系統(tǒng)

2022-10-26 07:14:25

Spring 6Spring業(yè)務(wù)

2024-05-31 14:06:55

SpringCDSGraalVM

2021-11-29 21:42:44

微軟Windows 11Windows

2009-06-24 09:22:04

Spring2.5新特

2024-12-03 10:46:48

Spring優(yōu)化開發(fā)

2025-02-25 08:00:00

SpringBootLua開發(fā)

2021-08-12 10:32:50

Spring Boot參數(shù)校驗(yàn)分組校驗(yàn)

2021-08-10 15:11:27

Spring Boot參數(shù)校驗(yàn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)