实体类字段用 @Value 赋了默认值,取出来还是 null?

测试环境导数据,一万两千单跑到八千多行挂了。 日志里有用的一行:

复制代码
java.lang.NullPointerException

底下 at 那几行是业务包名,我不贴。 指过去的代码是这句:

java 复制代码
`String path = tmpPath + "/upload";
`

tmpPath 上面明明挂着注解:

java 复制代码
`@Value("${file.tmp.path}")
private String tmpPath;
`

我第一反应是配置漏了。 可同一个 key 在 application.yml 里躺着,测试环境那份也有, 本地单测还是绿的。

卡了半小时才看到调用方那一句:

java 复制代码
`ExcelHelper helper = new ExcelHelper();
`

就这。 我一直以为 @Value 是编译期就把值写进字段的那种注解。 实际是容器创建 bean 之后,再回头把值塞进字段。 自己 new 的对象容器根本不认识,它插不上手, 字段就停在 Java 给的初始值那一步,引用类型是 null。

我本地单测能过,是因为拿的是容器里的实例:

java 复制代码
`@Autowired
private ExcelHelper helper;
`

同一个类,两种拿法,一个有值一个没值。 Spring Boot 2.1.6,跟版本没关系,纯粹是拿对象的方式不对。

另外两种写法也常被一起提,我得分开说。

字段是 static 的,我能确定的只有一件事: 这个类压根没进容器的时候,它跟实例字段一样没人管,一直 null。 容器管的 bean 能不能把值写进静态字段我没试过, 网上那种「static 一律注不进去」的绝对话我也不太敢信。

final 那个我原本以为也是同一个坑,其实不成立。 不给初值、构造里也不赋值,它根本跑不起来,javac 先拦一道:

复制代码
FinalBlank.java:2: error: variable tmpPath not initialized
in the default constructor

编译都过不去,拿不到 null,这一种不用防。

还有一个误会挺多的:${key} 里得加冒号才算给默认值。

java 复制代码
`@Value("${file.tmp.path:}")
@Value("${file.tmp.path:/data}")
`

冒号后面留空也算给了,给的是空串。

冒号都不写、配置又真缺了,那反而好查,启动阶段直接给你:

复制代码
Could not resolve placeholder 'file.tmp.path'

进程起不来,不会拖到跑数据跑到一半。 最怕的是压根没进容器这种,一声不吭。

我原本想加一行日志自查,看类名是不是带 CGLIB 那一长串后缀。 后来发现这条路不成立:这个类身上没有任何 AOP, 容器给的实例类名也是光秃秃的,跟 new 出来的长得一样。

改成看这行日志打几次:

java 复制代码
`public ExcelHelper() {
    log.info("ExcelHelper init");
}
`

容器里是单例,整个进程就一行。 谁在 new 它,调一次刷一行,一眼就能看出来。

数据我后来重导了一遍,八千行往后那部分补上的。 tmpPath 这个坑算是填了,可测试环境那边改一次路径就得重启一次服务, 每次七八分钟起不来,这事一直挂着没人管。

相关推荐
Rabitebla7 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
爱分享的康康8 小时前
康谋矿山机械多传感器数采方案:矿山自动驾驶数据采集落地实践分析
经验分享
坤坤子吖12 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
光视界13 小时前
从汞灯到 UV-LED:ALE 如何助力光刻机完成环保升级
经验分享
联蔚盘云14 小时前
DevOps 正在从“交付工具”进化为企业级生产力引擎
经验分享
YLCHUP16 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
旖旎夜光17 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
八十天环游世界19 小时前
财务自动化项目的ROI怎么测算?要看哪些指标?
经验分享
网安小学生(兼顾数据库版)19 小时前
艾体宝 TrueFoundry 如何让企业 AI 工具集成避免 “孤岛化“?
经验分享·艾体宝·艾体宝it·艾体宝truefoundry
星恒随风1 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql