emanjusaka —— 彼岸花开可奈何

彼岸花开可奈何

微知识:@ConfigurationProperties 失效的一种特殊情况

2024-03-29

@ConfigurationProperties 失效的一种特殊情况

@ConfigurationProperties遇到 static 修饰的字段属性时会出现获取值为 null 的问题。造成问题的原因是:

  1. @Data注解不会为静态属性生成 setter 方法

  2. Spring Boot 注入 Bean 也不会调用静态的 setter 方法注入值

 package top.emanjusaka.config;
 ​
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 ​
 @ConfigurationProperties(prefix = "file")
 @Component
 @Data
 public class FileProperties {
 ​
     /**
      * 案例文件夹
      */
     private String caseFolder;
 ​
     /**
      * 根路径
      */
 ​
     private static String rootPath;
     /**
      * excel 模板
      */
     private String litigantXlsx;
 ​
     /**
      * 文书上传路径
      */
     private String docUpload;
 ​
     public static String getRootPath() {
         return rootPath;
     }
 ​
 }
 package top.emanjusaka;
 ​
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import top.emanjusaka.config.FileProperties;
 ​
 @SpringBootApplication
 public class Application {
     public static void main(String[] args) {
         System.out.println(FileProperties.getRootPath());
     }
 }

上面代码是从配置文件获取配置项的值。但是当我们调用 FileProperties 的 getRootPath() 方法时并拿不到我们需要的值。

解决方案

我们可以手动写一个 Setter 方法(不能是静态的),在字段上使用@Setter注解并不能解决问题,因为它生成的是一个静态的 setter 方法,Spring Boot 无法成功注入配置值。静态的 setter 方法无法直接用于注入配置项的值,是因为 @ConfigurationProperties注解的机制是基于实例对象的属性绑定的。@ConfigurationProperties 注解通过创建一个实例对象,并将配置项的值绑定到该对象的属性上。在这个过程中,Spring Boot会使用反射调用实例对象的 setter 方法,将配置项的值传递给该方法来设置属性的值。由于静态方法是与类相关联的,而不是与实例对象相关联的,因此无法通过实例对象的 setter 方法来设置静态属性的值。

     public void setRootPath(String rootPath) {
         this.rootPath = rootPath;
     }

在技术的星河中遨游,我们互为引路星辰,共同追逐成长的光芒。愿本文的洞见能触动您的思绪,若有所共鸣,请以点赞之手,轻抚赞同的弦。

原文地址: https://www.emanjusaka.top/2024/03/spring-boot-annotation-configurationProperties-invalid

微信公众号:emanjusaka的编程栈