springboot框架下,请使用@ConfigurationProperties替代@Value加载配置

news2024/9/23 11:17:12

一、背景

  • 程序启动时,详细报错见下:

10:40:31.965 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘redisDistributedLocker’: Unsatisfied dependency expressed through field ‘redissonClient’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘redissonConfig’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘spring.redis.password’ in value “${spring.redis.password}”

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘redissonConfig’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘spring.redis.password’ in value “${spring.redis.password}”

其他报错信息,我就不贴出来了,提示我们读取不到spring.redis.password。
源码见下:

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private String port;

    @Value("${spring.redis.password}")
    private String password;
}

二、排查过程

  • 1、@Value注解使用时,需要注意属性值为空的情况
    如果您尝试获取一个不存在的属性或属性值为空,则会抛出异常。
    而我们开发环境搭建的redis,恰好就是没有密码的。
    所以,我们的配置是:
spring:
  redis:
    host: 192.168.81.116
    port: 6379
    timeout: PT3S

预期的配置却是:

即使spring.redis.password为空,也需要把它配置一个空值。

spring:
  redis:
    host: 192.168.81.116
    port: 6379
    timeout: PT3S
    password: 

你也可以修改上面的Java源码,一个冒号就可以增强程序的健壮性。

// 注意末尾加一个冒号,意味着可以为空
    @Value("${spring.redis.password:}")
    private String password;
  • 2、使用@ConfigurationProperties替换@Value
@Configuration
@Data
@RefreshScope
@ConfigurationProperties(prefix = "spring.redis")
public class RedissonConfig {

    private String host;

    private String port;

    private String password;
}
  • 3、nacos读取配置的优先级低
    这里以user-service服务为例,以示说明spring boot程序读取nacos配置。对应的源码类是NacosPropertySourceBuilder.java。
    它会读取四个DataId,分别是:

    • application.yml
    • private-user-service.yml
    • user-service
    • user-service.yml

所以在启动的时候,不出意外,你的程序也会打印警告信息:

2023-07-28 10:35:13.202 WARN 17588 — [ main] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[user-service] & group[DEFAULT_GROUP]

不要被他误导了,以为没有读取到nacos配置。

  • 4、试图把spring.redis.password配置到Nacos上, 仍旧报错
    所以,你如果不想增加@Value的默认值,也不想使用@ConfigurationProperties,那么你就必须在resources/application.yml文件里配置,像下面这样:
    在这里插入图片描述

三、总结

在我们封装jar包,或者写配置类的时候,一定要考虑配置项的可能为空情况以及动态刷新。

所以我建议你使用注解@ConfigurationProperties,并且增加@RefreshScope支持动态刷新,特别是业务上的配置项,修改后不用重启服务,做到及时刷新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入 在家庭影院中,要享受一场电影,需要如下步骤: 直接用遥控器:统筹各设备开关开…

De Bruijin序列与魔术(一)——De Bruijin序列简介

早点关注我,精彩不错过! 欢迎回到数学魔术系列!久违了! 在牌序领域,一个特别数学化也是很冷门的一个序,DeBruijin序列,算是经典中的经典了。但它在魔术圈里流传并不甚广的原因是,可扩…

再创佳绩!数据猿荣获《2023金融科技影响力品牌》奖

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 7月26日至27日,CFS2023第十二届财经峰会暨2023可持续商业大会在北京举行,峰会期间举行了开幕式、高层论坛、CFS致敬盛典、2023品牌创新展等主题活动,以及多场关于数字化转型、金融创新、新…

一分钟搞定谷歌浏览器无法翻译的问题

文章目录 前言一、找到hosts.xml文件二、以记事本方式打开hosts文件三、在hosts文件最下方加入以下内容,点击保存:四、刷新DNS五、关闭google浏览器重新打开即可。 前言 提示:这里可以添加本文要记录的大概内容: 据CSDN消息&…

【Java 高频面试闯关秘籍】大梦谁先觉,平生我自知

一、mysql使用innodb引擎,请简述mysql索引的最左前缀如何优化orderby语句? 关键点: (1)如果排序字段不在索引列上,filesort有两种算法:mysql就要启动双路排序和单路排序 (2&#x…

Diffusion Model 浅学笔记

Diffusion Model Created by: 银晗 张 Created time: May 29, 2023 8:12 AM VAE → GAN →Diffusion 要讲扩散模型,不得不提VAE。VAE和GAN一样,都是从隐变量Z生成目标数据X。 它们假设隐变量服从某种常见的概率分布(比如正态分布&#xff…

Android Unit Test

一、测试基础知识 1.1 测试级别 测试金字塔(如图 2 所示)说明了应用应如何包含三类测试(即小型、中型和大型测试): 小型测试是指单元测试,用于验证应用的行为,一次验证一个类。 中型测试是指…

ROS中使用Kinect v2

ROS中使用Kinect v2 Kinect v2 简介 Kinect v2是微软公司推出的第二代Kinect深度摄像头,也称为Kinect for Xbox One或Kinect for Windows v2。它是Kinect系列产品的升级版本,于2013年首次发布。Kinect v2采用了一系列先进的传感器和技术,使其…

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型 版本更新: 2023/7/29版本: 1.增加自定义参数,方便直接套数据运行。 pre_num3;%预采样数据个数 learn_pr0.85; %训练数据比例(不包括预采样数…

通讯录--集合动态的文件版

简易的通讯录往往需要朴实的“烹饪”就能完成一道“美味的佳肴”。 我们需要一个通讯录,能够存储联系人的信息,能够对联系人的信息进行增删查改,查询,按姓名排序。相比对之前的三子棋、扫雷,有了一定的了解&#xff0c…

一起学数据结构(2)——线性表及线性表顺序实现

目录 1. 什么是数据结构: 1.1 数据结构的研究内容: 1.2 数据结构的基本概念: 1.2.1 逻辑结构: 1.2.2 存储结构: 2. 线性表: 2.1 线性表的基本定义: 2.2 线性表的运用: 3 .线性…

【学会动态规划】打家劫舍 II(12)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

JavaScript学习 -- SM3算法基本原理

SM3算法是一种由国家密码管理局发布的哈希算法,被广泛用于数字签名和消息认证等应用中。在JavaScript中,我们可以使用第三方库来计算数据的SM3哈希值。本篇文章将介绍SM3算法的基本原理和相关技术,并提供一些实例来演示如何在JavaScript中使用…

深度剖析六大国产CPU

前言 CPU 是底层硬件基础设施中的核心,当前主流芯片架构为 ARM 和 X86,均为国外主导,芯片国产化率较低。“十五”期间,国家启动发展国产 CPU 的泰山计划,863 计划也提出自主研发 CPU。2006 年核高基专项启动&#xff…

阿里云服务器CPU处理器大全

阿里云服务器CPU型号是什么?处理器主频多少?云服务器ECS和轻量应用服务器CPU处理器性能如何?阿里云服务器网分享阿里云服务器CPU型号大全、处理器主频性能型号汇总: 目录 阿里云服务器CPU处理器大全 通用型云服务器CPU 计算型…

Redis系列:Redis 的事务机制

1 复习下何为事务机制? Transaction(事务)是计算机的特有术语,它一般指单个逻辑工作单位,由一系列的操作组合而成,在这些操作执行的时候,要么都执行成功,要么都不执行,防…

ENSP中路由器配置详解

目录 一:两个主机,两个路由器配置连接 二:两主机,三路由器配置连接 三:配置浮动路由 一:两个主机,两个路由器配置连接 打开ENSP 1.点击新建拓扑 2.点击路由器 3.将两个AR3260路由器拖出来…

ShardingSphere-Proxy读写分离详解与实战

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

基于springboot的公交线路查询系统vue

本次开发一套公交线路查询系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,公交线路管理,网站公告管理,友情链接管理,留言管理,系统管理。用户可以注册登录,查看公告线路…

java使用easyexcel读写文件

文章目录 前言一、引入pom二、write1.代码部分2.执行结果 三、read1.代码部分2.运行结果 总结 前言 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题…