报错记录:构造方法获取不了@Value的值,问题刨析与解决方案

news2025/7/19 10:47:37

报错记录:构造方法获取不了@Value的值,问题刨析与解决方案

有时我们需要在构造函数中初始化属性,之前老的项目是用的I/O流来获取配置文件的值,目前配置转为线上,使用Apollo来获取值,由于获取Apollo的值被封装到了Spring容器中,我们就需要使用Spring容器中的配置值

而获取配置最简单的方式就是使用@Value注解,但是老的项目中使用构造方法来初始化kafka的配置信息,这里项目初始化就会报错,debug后,发现获取的配置文件信息为null,导致bug出现

原因是:对象被Spring容器接管之前会调用构造函数构造对象,导致注解失效,构造函数执行完成被Spring容器接管之后才会调用@Value注解将配置注入对应的属性当中

下面是解决方案

一、查看Spring容器接管对象时的执行顺序

1、A.java

@Component
public class A {
    public A(){
        System.out.println("构造函数");
    }
    public void Test(){
        System.out.println("Test");
    }
}

2、测试类ATest.java

@SpringBootTest
public class ATest {
    @Autowired
    private A a;

    @Test
    public void TestA(){
        a.Test();
    }
}

3、结果

在这里插入图片描述

二、查看到底是配置文件没有对应的值还是说@Value注解没生效

1、在配置文件中有两个值

num=1
url="http://localhost:8080/test"

2、改造一下A.java类,看看普通方法

@SpringBootTest
public class ATest {
    @Value("${num}")
    private int num;

    @Value("${url}")
    private String url;

    @Value("${url:测试}")
    private String url2;

    @Value("${url3:测试默认值}")
    private String url3;

    @Autowired
    private A a;

    public A(){
        System.out.println("===========构造函数================");
        System.err.println(num);
        System.err.println(url);
        System.err.println(url2);
        System.err.println(url3);
    }
    public void Test(){
        System.out.println("===========Test方法================");
        System.err.println(num);
        System.err.println(url);
        System.err.println(url2);
        System.err.println(url3);
    }
}

2、运行测试类ATest.java的Test方法

@SpringBootTest
public class ATest {
    @Autowired
    private A a;

    @Test
    public void TestA(){
        a.Test();
    }
}

3、结果@Value没有生效,当然@ConfigurationProperties也不会生效

(1)、@Value注解

在这里插入图片描述

(2)、@ConfigurationProperties注解,我这里打了个断点直接看整个Animal.java类,这个类我没有放到本文的里面,没有必要,反正不行就对了

在这里插入图片描述

4、结论

由于基本数据类型int的默认值为0,而String是一个类,默认值就是null

url3url2这两个属性中的@Value注解我加入了默认值,如果@Value生效了,且在配置文件中找不到值,那么返回的则是默认值

而此处四个属性都返回的基本的默认值,说明执行构造函数的时候,Spring并没有接管该对象,导致@Value注解根本就没有生效

三、解决方案:使用@PostConstruct注解

在这里插入图片描述

1、改造A.java

@Component
public class A {

    @Value("${num}")
    private int num;

    @Value("${url}")
    private String url;

    @Value("${url:测试}")
    private String url2;

    @Value("${url3:测试默认值}")
    private String url3;

    public A(){
        System.out.println("===========构造函数================");
        System.err.println(num);
        System.err.println(url);
        System.err.println(url2);
        System.err.println(url3);
    }
    public void Test(){
        System.out.println("===========Test方法================");
        System.err.println(num);
        System.err.println(url);
        System.err.println(url2);
        System.err.println(url3);
    }
    @PostConstruct
    public void initField(){
        System.out.println("===========构造函数结束之后自动执行================");
        System.err.println(num);
        System.err.println(url);
        System.err.println(url2);
        System.err.println(url3);
    }
}

2、执行测试类ATest.java

@SpringBootTest
public class ATest {
    @Autowired
    private A a;

    @Test
    public void TestA(){
        a.Test();
    }
}

3、结果

在这里插入图片描述

这里有关于@PostConstruct注解的详解有兴趣的小伙伴可以看一下:Spring框架@PostConstruct注解详解 - 掘金 (juejin.cn)

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

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

相关文章

浅述 国产仪器 1761程控模块电源

1761程控模块电源是在自动测试环境中提供偏置功率和对部件或最终产品提供激励的理想设备,是测试系统必备的测试仪器。适用于研发、设计、生产制造等自动测试领域。 1761程控模块电源为用户选配电源提供了灵活性,根据需要可选购1~8种&#xff…

6.登录token

登录时生产token和refreshtoken,请求时带上token,后台校验,通过的话则进行处理,否则返回错误信息(token失效过期等等),校验不通过会调用刷新token的接口,重新获取token,如…

< 封装公共导出模块:配合element实现提示 >

封装公共导出模块 👉 前言👉 一、原理👉 二、实现案例👉 三、效果演示往期内容 💨 👉 前言 在 Vue elementUi 开发中,我们偶尔会遇到需要导出的列表,或者指定位置的导出内容。在一…

神经网络基础-手写数字识别

手写数字识别神经网络 基本原理 图像本质上被认为是一个矩阵,每个像素点都是一个对应的像素值,相当于在多维数据上进行相关的归类或者其他操作。 线性函数 线性函数的一个从输入到输出的映射,用于给目标一个每个类别对应的得分。 图像 ( …

leetcode刷题(9)二叉树(3)

各位朋友们,提前祝大家五一劳动节快乐啊!!!今天我为大家分享的是关于leetcode刷题二叉树相关的第三篇我文章,让我们一起来看看吧。 文章目录 1.二叉树的层序遍历题目要求做题思路代码实现 2.从前序与中序遍历序列构造二…

Authing 正式发布应用集成网关 - Authing Gateway

2023 年 2月, Authing 推出了身份领域的 PaaS化应用集成网关 - Authing Gateway 。 Authing Gateway 提供将原有应用快速集成到 Authing 身份云产品的能力,在扩充身份认证方式的同时,提高资源的安全性和数据的隐私可靠性。 01.Authing Gatew…

如何查看声卡、pcm设备以及tinyplay、tinymix、tinycap的使用

命令列表 功能命令查看当前录音进程状态dumpsys media.audio_flinger查看当前音频策略状态dumpsys media.audio_policy查看pcm节点信息cat /proc/asound/pcm查看声卡信息cat /proc/asound/cards查看声卡物理设备节点ls /dev/snd/驱动层录音命令tinycap xx.wav -D 0 -d 1 -c 2 …

【Java EE】-博客系统(前端页面)

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 且视他人如盏盏鬼火,大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容:博客系统 登陆页面,列表页面,详情页…

OpenAI推企业版ChatGPT,英伟达造AI安全卫士

GPT现在已经进入了淘金时代。虽然全球涌现出成千上万的大模型或ChatGPT变种,但一直能挣钱的人往往是卖铲子的人。 这不,围绕暴风眼中的大模型,已经有不少企业,开始研究起了大模型的“铲子”产品,而且开源和付费两不误…

【C++】——string的功能介绍及使用

前言: 在上期,我们简单的介绍了关于 模板和STL ,今天我就带领大家学习一下关于 【string】类。本期,我们主要讲解的是关于 【string】的基本介绍以及【string】类的常用接口说明。有了以上的基本认识之后,在下期&…

全球SPD市场迎来黄金时代,中国领跑全球增长

近日,专注于前沿领域的国际咨询机构ICV发布了全球单光子探测器市场研究报告,报告分析了单光子探测器(SPD)市场,包括产品定位、下游应用、主要供应商、市场情况和未来趋势等各个方面,以进行分析和预测。 研究…

微服务 - kong安装,API网关设计(原理篇)

概述 微服务实践的第二个关键组件,微服务API网关设计,API网关是对微服务做统一的鉴权、限流、黑白名单、负载均衡等功能实现,这篇我们先来介绍Api网关的意义和安装kong/konga需要的组件。 网关的作用和意义 网关可以使得服务本身更专注自己的领域&…

Linux Ansible管理变量、管理事实、管理机密

目录 Ansible变量 变量定义范围 变量类型 定义变量并引用 事实变量与魔法变量 事实变量 魔法变量 Ansible加密 ansible-vault参数 ansible-vault举例 Ansible变量 Ansible支持利用变量来存储值,并且可以在Ansible项目的所有文件中重复使用这些值 变量可能…

浏览器缓存原理

使用 HTTP 缓存的好处:通过复用缓存资源,减少了客户端等待服务器响应的时间和网络流量,同时也能缓解服务器端的压力。可以显著的提升网站的应用性能。 HTTP 缓存策略分为两种:强制缓存、协商缓存。 强制缓存 浏览器缓存没有过期…

[pgrx开发postgresql数据库扩展]5.自定义函数与SQL组合应用

老规矩的声明: 并不是所有场景都需要(或者适合)用rust来写的,绝大部分操作数据库的功能和计算,用SQL就已经足够了! 本系列中,所有的案例,仅用于说明pgrx的能力,而并非是…

BPMN2.0 任务-用户任务

“用户任务(user task)”用于对需要人工执行的任务进行建模。当流程执行到达用户任务时,会为指派至该任务的用户或组的任务列表创建一个新任务。 用户任务用左上角有一个小用户图标的标准任务(圆角矩形)表示。 用户任务在XML中如下定义。其中id是必须属性,name是可选属性…

提高网络安全性:探索ADAudit Plus的全功能IT安全审计解决方案

网络安全一直是组织和企业需要关注的重要问题之一,因为随着企业数字化的加速和技术的不断发展,网络攻击的威胁也变得越来越严峻。因此,组织和企业需要采取措施保护其信息资产和网络安全。 ADAudit Plus是一种全功能的IT安全审计解决方案&…

2023年商票研究报告

第一章 行业概况 1.1 定义 商票是指出票人依托商业汇票系统,以数据电文形式制作的,委托付款人在指定日期无条件支付确定的金额给收款人或者持票人的票据。按承兑人的不同,商业汇票分为银行承兑汇票和商业承兑汇票(即商票&#x…

flex布局 高度没有自动撑到max-height

在做一个项目时,用到了竖向flex布局,我写了max-height: 820px, 但是到小屏幕时,只能撑到773px,解决方法是height: max-content. 但是不知道为什么只能撑到773px便撑不动了。 https://zhuanlan.zhihu.com/p/130460207 这个文档说的…

workerman开发者必须知道的几个问题

1、windows环境限制 windows系统下workerman单个进程仅支持200个连接。 windows系统下无法使用count参数设置多进程。 windows系统下无法使用status、stop、reload、restart等命令。 windows系统下无法守护进程,cmd窗口关掉后服务即停止。 windows系统下无法在一个…