微知识:@ConfigurationProperties 失效的一种特殊情况
@ConfigurationProperties 失效的一种特殊情况
当@ConfigurationProperties
遇到 static 修饰的字段属性时会出现获取值为 null 的问题。造成问题的原因是:
@Data
注解不会为静态属性生成 setter 方法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的编程栈