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

news/2024/12/5 8:53:22/

一、背景

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

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.116port: 6379timeout: PT3S

预期的配置却是:

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

spring:redis:host: 192.168.81.116port: 6379timeout: PT3Spassword: 

你也可以修改上面的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.ppmy.cn/news/984806.html

相关文章

Docker 容器高级操作

Docker容器高级操作 Docker容器创建、停止、启动、删除等基础操作上篇已述,然Docker容器被广大开发者青睐,不可能只有如此简单的功能,必有高阶功法。那么接下来 让我们一同走进容器操作的高级篇,领略其高级操作的魅力。 查看容器 docker ps -a | grep tomcat [root@tudou…

如何将数字高程模型加载到地图中查看,并进行在线编辑和分享?

四维轻云是一款地理空间数据在线管理平台,具有地理空间数据的在线管理、查看及分享等功能。在四维轻云平台中,用户可以将数据加载至地图中查看,并使用渲染、视图、标绘等工具。 现在,小编就来告诉大家如何将数字高程模型加载到地…

DevOps-Git

DevOps-Git 版本控制软件提供完备的版本管理功能,用于存储,追踪目录(文件夹)和文件的修改历史。版本控制软件的最高目标是支持公司的配置管理活动,最终多个版本的开发和维护活动,即使发布软件。 git安装 h…

深度学习入门(二):神经网络整体架构

一、前向传播 作用于每一层的输入,通过逐层计算得到输出结果 二、反向传播 作用于网络输出,通过计算梯度由深到浅更新网络参数 三、整体架构 层次结构:逐层变换数据 神经元:数据量、矩阵大小(代表输入特征的数量…

Node.js学习笔记-02

三、node的异步I/O 四、异步编程 1、函数式编程 高阶函数 函数可以作为参数或者返回值。 偏函数用法 偏函数用法是指创建一个调用另外一个部分——参数或变量已经预置的函数——的函数的用法。 举个例子:在JavaScrip中进行类型判断时,我们通常会进…

【linux 结束pts/1踢人踢除另一个终端】

centos7上误执行了个命令,导致一直刷屏,强制CTRLC无法正常退出,一直出现如下: 网上搜索通过ctrlD,q均无法正常退出, 不想强行关掉,通过:who命令查看均用户: who mshns…

什么是消息队列?

目录 什么是消息队列? 消息队列中间件 消息队列的应用场景 异步处理 系统解耦 流量削峰 日志处理 什么是消息队列? 消息队列,英文名:Message Queue,经常缩写为MQ。从字面上来理解,消息队列是一种用来…

郑州Sectigo DV通配符SSL证书

我们在浏览器访问网页时或许不会注意到网站是http还是https链接,但是一定能注意到浏览器给我们展示的“不安全”警告,警告访问者网站未加密,访问网站会有泄露隐私的危险。SSL证书能将网站链接由http转为https,对网站传输数据加密&…