SpringBoot的ConfigurationProperties或Value注解无效问题及解决

 更新时间:2024年11月01日 15:09:40   作者: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日志框架之Log4j2快速入门与参数详解

    SpringBoot日志框架之Log4j2快速入门与参数详解

    本文介绍了SpringBoot日志框架log4j2的基本使用和配置方法,包括将日志输出到控制台、文件、Elasticsearch和Kafka,多个输出目的地的配置,异步日志记录器的使用以及log4j2.xml配置文件的详细语法和参数含义,需要的朋友可以参考下
    2023-05-05
  • Java多线程中的Phaser详解

    Java多线程中的Phaser详解

    这篇文章主要介绍了Java多线程中的Phaser详解,Pahser是一个可以重复使用的同步屏障,Phaser是按照不同阶段执行线程的,它本身维护着一个叫 phase 的成员变量代表当前执行的阶段,需要的朋友可以参考下
    2023-11-11
  • java怎样动态获取泛型参数的类型

    java怎样动态获取泛型参数的类型

    在Java中,泛型信息在编译时会被擦除,但可以通过特定API获取运行时的泛型参数类型,主要API包括Class的getGenericSuperclass()和getGenericInterfaces()方法,以及ParameterizedType的getActualTypeArguments()方法
    2024-09-09
  • SpringBoot前后端分离实现验证码操作

    SpringBoot前后端分离实现验证码操作

    验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot是如何提供服务的
    2022-05-05
  • Java ArrayList的底层实现方法

    Java ArrayList的底层实现方法

    今天小编就为大家分享一篇Java ArrayList的底层实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 使用log4j2关闭debug日志

    使用log4j2关闭debug日志

    这篇文章主要介绍了使用log4j2关闭debug日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java原码补码反码关系解析

    java原码补码反码关系解析

    这篇文章主要为大家详细介绍了java原码补码反码的关系,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • MyBatis配置与CRUD超详细讲解

    MyBatis配置与CRUD超详细讲解

    这篇文章主要介绍了MyBatis配置与CRUD,CRUD是指在做计算处理时的增加(Create)、读取(Read)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能
    2023-02-02
  • 解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题

    解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题

    我们在使用idea的时候经常会遇到一些问题,本文介绍了如何解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题,文中有相关的图文示例,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java定时任务的实现方法

    java定时任务的实现方法

    java定时任务的实现方法,需要的朋友可以参考一下
    2013-03-03

最新评论