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

一、背景

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

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.mzph.cn/news/13774.shtml

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

相关文章

Tribon二次开发- tbbatchjob

在Tribon安装目录下C:\Tribon\M3\Bin里面有许多未知用途的exe,有的双击后时一个DOS终端,有的一闪而过,有的需要按照提示输入信息,有的需要提前在指定的目录配置文件,该如何使用呢? 这些exe大多可以在Tribon以外通过.NET来使用,有的可以通过添加.NET项目引用来使用,有的…

Spring Cloud Alibaba - Nacos源码分析(三)

目录 一、Nacos客户端服务订阅的事件机制 1、监听事件的注册 2、ServiceInfo处理 serviceInfoHolder.processServiceInfo 一、Nacos客户端服务订阅的事件机制 Nacos客户端订阅的核心流程:Nacos客户端通过一个定时任务,每6秒从注册中心获取实例列表&…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

Flink CEP(二) 运行源码解析

通过DemoApp学习一下&#xff0c;CEP的源码执行逻辑。为下一篇实现CEP动态Pattern奠定理论基础。 1. Pattern的定义 Pattern<Tuple3<String, Long, String>,?> pattern Pattern.<Tuple3<String, Long, String>>begin("begin").where(new…

数据分析-关于指标和指标体系

一、电商指标体系 二、指标体系的作用 三、统计学中基本的分析手段

移远通信推出新一代高算力智能模组SG885G-WF,为工业和消费级IoT应用带来全新性能标杆

2023年7月24日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出其新一代旗舰级安卓智能模组SG885G-WF。该智能模组具有高达48 TOPS 的AI综合算力、强大性能及丰富的多媒体功能&#xff0c;非常适用于需要高处理能力和多媒体功能的工业和消费者…

OpenCV 对轮廓进行多边形逼近(Polygon Approximation)

在 OpenCV 中&#xff0c;cv::approxPolyDP 是一个函数&#xff0c;用于对轮廓进行多边形逼近&#xff08;Polygon Approximation&#xff09;。它可以将复杂的轮廓逼近为简化的多边形&#xff0c;从而减少轮廓的数据点&#xff0c;使轮廓更加紧凑。 函数原型如下&#xff1a;…

react钩子函数

React组件的生命周期包括多个阶段和方法&#xff0c;用于在组件不同的生命周期时执行特定的操作。以下是React类组件中常见的生命周期方法&#xff1a; 挂载阶段&#xff08;Mounting Phase&#xff09;&#xff1a; constructor&#xff1a;组件实例化时调用&#xff0c;用于初…

如何在win10环境下配置强化学习gym库(使用vscode)

我是通过anacondavscode完成的gym库的使用&#xff0c;只是把案例跑起来了&#xff0c;具体步骤如下&#xff1a; 1、安装anaconda,参考链接&#xff1a;https://www.jianshu.com/p/2f3be7781451 我其实就是生安装的&#xff0c;也没有去配置环境啥的&#xff0c;就是下载安…

FANUC机器人SRVO-217故障报警原因分析及参考解决办法

FANUC机器人SRVO-217故障报警原因分析及参考解决办法 如下图所示,示教器提示:SRVO-217紧急停止电路板未找到, 查阅手册可以看到以下的报警说明: 故障原因: 通电时未能识别紧急停止电路板或者增设的安全I/O装置。连接有多个安全I/O装置的系统中,在报警信息的最后,会显示发…

进程_PCB 的理解

目录 一. PCB 的概念 1. 为什么需要PCB 2. PCB的属性 二. task struct 1. task struct 介绍 2. 查看进程指令 3. PID 4. PPID 父进程是什么&#xff1f; 为什么要有父进程&#xff1f; 5. fork 创建子进程 1) fork 后的现象 为什么会打印两次&#xff1f; 2) 的返…

自动驾驶感知系统--惯性导航定位系统

惯性导航定位 惯性是所有质量体本身的基本属性&#xff0c;所以建立在牛顿定律基础上的惯性导航系统&#xff08;Inertial Navigation System,INS&#xff09;(简称惯导系统)不与外界发生任何光电联系&#xff0c;仅靠系统本身就能对车辆进行连续的三维定位和三维定向。卫星导…

fastadmin

什么是fastadmin FastAdmin是一个基于PHP的开源Web应用程序开发框架&#xff0c;它是基于ThinkPHP和其他库开发的。FastAdmin旨在通过提供模块化、可扩展和用户友好的平台来简化Web应用程序的开发。它带有各种内置功能和特性&#xff0c;使开发人员能够快速构建功能强大且可定…

Linux学成之路(基础篇0(二十三)MySQL服务(主从MySQL服务和读写分离——补充)

目录 一、MySQL Replication概述 优点 异步复制&#xff08;Asynchronous repication&#xff09; 全同步复制&#xff08;Fully synchronous replication&#xff09; 半同步复制&#xff08;Semisynchronous replication&#xff09; 三、MySQL支持的复制 四、部署主从…

Linux 配置免密登录

Linux 配置免密登录 实例# 生成公钥和私钥 ssh-keygen -t rsa Tips: 执行后会在~/.ssh/目录下创建 id_rsa 和 id_rsa.pub 文件 生成省份认证文件 ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.18 Tips: 三次回车; 作用是将本地公钥填充到一个远程主机192.168.0.18的 au…

ant-design-vue中table组件使用customRender渲染v-html

ant-design-vue遇到table中列表数据需要高亮渲染 1、customRender可以使用&#xff0c;但是使用v-html发现不生效还报错 const columns [title: name,dataIndex: name,customRender: (val, row) > {return <span v-html{val}></span>} ]2、customeRender函数…

手写vuex

vuex 基本用法 vuex是作为插件使用&#xff0c;Vue.use(vuex) 最后注册给new Vue的是一个new Vuex.Store实例 // store.js import Vue from vue import Vuex from vuexVue.use(Vuex) // Vue.use注册插件 // new Vuex.Store实例 export default new Vuex.Store({state: {},gette…

Linux终端执行.sh脚本,提示权限不够的解决办法

错误提示如下&#xff1a; [root]# ./run_train_p bash: ./run_train_p: 权限不够解决方法 [root]# chmod 777 ./run_train_p [root]# ./run_train_p

【树链剖分+MST】CF609E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 先把全局的MST求出来&#xff0c;然后对于一条边&#xff0c;如果它本来就在MST中&#xff0c;说明代价就是MST的权值和&#xff0c;否则它加入MST中&#xff0c;此时MST形成了环&#xff0c;我们把环中最大的那…

docker安装rabbitmq

1&#xff0c;拉取rabbitmq容器 docker pull rabbitmq 2&#xff0c;下载完以后启动容器 先查看自己的容器id&#xff1a; [rootch ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE rabbitmq latest bcef1e…