SpringBoot的ConfigurationProperties或Value注解无效问题及解决
作者:Cadreman Johnson
在SpringBoot项目开发中,全局静态配置类读取application.yml或application.properties文件时,可能会遇到配置值始终为null的问题,这通常是因为在创建静态属性后,IDE自动生成的Get/Set方法包含了static关键字
SpringBoot的ConfigurationProperties或Value注解无效
记录一个问题
在一般的SpringBoot项目开发中,我们一般会创建一些全局的静态配置类,用来读取application.yml/application.properties配置文件的内容。
普遍的做法是利用@Component和@ConfigurationProperties(prefix = “XXX”)这两个注解来帮我们实现。
# 项目相关配置 cadre: # 名称 name: cadreuc
package com.cadre.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 全局配置类
*
* @author cadre
*/
@Component
@ConfigurationProperties(prefix = "cadreman")
public class Global
{
/** 项目名称 */
private static String name;
public static String getName()
{
return name;
}
public static void setName(String name)
{
Global.name = name;
}
}
原理非常简单,利用Spring将属性注入到静态类,然后通过静态类的特性使我们可以在项目全局取到它的值。
但是,当我们照猫画虎的创建了一个静态类后,却发现我们取的值始终为null。
难道是Component注解失效了吗?并不是,我们创建一个同名的Bean后提示命名重复。
难道是ConfigurationProperties注解失效了吗?带着疑问,我们继续研究。
发现问题所在
作为一名资深的CV程序员,已经多年没有手打过Get/Set方法了。
然而问题就在这里。当我们创建了一个静态属性时,IDE帮我们生成的Get/Set方法都默认加上了static。
/** 项目名称 */
private static String name;
public static String getName()
{
return name;
}
public static void setName(String name)
{
Global.name = name;
}
而Spring在注入这些属性时,反射的Set方法不会对static方法起作用。
所以导致了我们的set方法没有被调用。
解决方法
去掉Set方法的static
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- SpringBoot中@ConfigurationProperties自动获取配置参数的流程步骤
- SpringBoot中的@Configuration、@MapperScan注解
- Springboot之@ConfigurationProperties注解解读
- Spring解读@Component和@Configuration的区别以及源码分析
- Springboot中@ConfigurationProperties轻松管理应用程序的配置信息详解
- 解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration
