Spring @Value引发的一次“血案”

IllegalArgumentException(非法参数异常)和其子类异常NumberFormatException,以及异常类之间的继承关系和产生原因 IllegalArgumentException(非法参数异常)以及它的儿子异常NumberFormatException继承关系,二者产生的原因等等 阅读详情

Spring @Value引发的一次“血案”

“血案”

在项目中使用Spring boot开发微服务,需要从application.properties读取一个配置项,示例如下:

    @Value("${test.boolean}")
    private boolean testBoolean;

结果一次升级过程中,误将配置项test.boolean的值写成空字符串"",直接导致服务启动失败!
启动异常信息:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testController': Unsatisfied dependency expressed through field 'testBoolean'; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value []
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1411) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:845) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) [spring-boot-2.1.8.RELEASE.jar:2.1.8.RELEASE]
	at com.example.demo.DemoApplication.main(DemoApplication.java:17) [classes/:na]
Caused by: org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value []
	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:79) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1199) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	... 19 common frames omitted
Caused by: java.lang.IllegalArgumentException: Invalid boolean value []
	at org.springframework.beans.propertyeditors.CustomBooleanEditor.setAsText(CustomBooleanEditor.java:154) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:429) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:402) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73) ~[spring-beans-5.1.9.RELEASE.jar:5.1.9.RELEASE]
	... 22 common frames omitted

@Value原理

搜索了一大堆资料,关于Spring @Value原理描述最清楚的应该是这篇博客:springboot中@Value的工作原理,非常感谢作者。看了这篇博客,基本上对@Value的原理和过程有个大概理解。因为我的示例中使用到了类型转换,从异常堆栈看,是String到boolean的类型转换抛出异常了。
直接查看Spring framework社区的CustomBooleanEditor.java源码,输入text为空字符串的情况下,如果allowEmpty是true,则可以转换成null,否则抛出IllegalArgumentException异常。

	@Override
	public void setAsText(@Nullable String text) throws IllegalArgumentException {
   
   
		String input = (text != null ? text.trim() : null)
IntelliJ IDEA中.env文件配置管理:Spring Boot环境变量最佳实践 环境变量是软件配置管理的核心概念,它允许应用程序在不同运行环境中动态调整行为,实现配置与代码的分离。其工作原理是通过操作系统或运行时环境提供键值对,供程序在启动时读取。这一机制的技术价值在于提升应用的可移植性、安全性和可维护性,是十二要素应用方法论的关键实践。在Java开发领域,尤其是在使用Spring Boot框架构建微服务或Web应用时,如何高效、安全地管理数据库连接、API密钥等敏感配置,是常见的工程挑战。本文聚焦于通过dotenv-java等库,将项目本地的.env文件与Spring Boot的配置 阅读详情

相关推荐

Java AES-256加密与微信支付V3回调解密:Illegal key size异常深度解析与解决方案

在Java应用开发中,加密技术是保障数据安全的核心环节,其原理基于Java密码学体系(JCA)提供的算法实现与密钥管理机制。然而,由于历史出口管制原因,Java默认的加密策略对密钥长度存在限制,例如AES算法在受限环境下仅支持128位密钥,这直接影响了需要使用AES-256等高强度加密的应用场景的技术价值。特别是在金融支付、安全通信等对数据保密性要求极高的领域,支持256位密钥的AES-256-GCM等算法已成为行业标准。当开发者将应用部署到生产环境,尤其是使用默认配置的OpenJDK时,极易遭遇“Ille

huqiyes的专栏 441

SpringBoot多环境配置实战:3种方法详解与选型指南

在软件工程实践中,配置管理是保障应用在不同生命周期阶段(开发、测试、生产)稳定运行的关键环节。其核心原理在于通过环境隔离机制,将可变配置与代码解耦,实现一套代码适应多种部署场景。这项技术的核心价值在于提升开发效率、保障部署安全,并实现CI/CD流程的自动化。典型的应用场景包括微服务架构下的服务部署、团队协作开发以及云原生环境中的应用发布。SpringBoot作为主流的Java开发框架,其YAML多环境配置方案提供了多种实现路径,例如通过单一文件多Profile文档块实现集中管理,或利用独立的`applica

weixin_34318272的博客 475

Java软件授权实战:基于TrueLicense构建企业级License系统

软件授权与许可管理是保护知识产权和实现商业化变现的核心技术。其基本原理是通过加密和验证机制,控制软件的分发与使用。在Java生态中,TrueLicense框架提供了一套基于非对称加密的成熟解决方案,能够有效防止盗版并支持复杂的收费模式。该框架通过私钥签名、公钥验证的机制,确保授权文件的完整性与真实性,其技术价值在于为软件提供了可扩展、安全的授权管理基础架构。典型的应用场景包括商业软件的按需收费、SaaS服务的订阅制管理以及私有化部署的权限控制。本文将结合**密钥对生成**与**License验证**等关键热

aqc802886的博客 369

Java RSA工具类实战:避开密钥加载、数据超长与线程安全三大坑

非对称加密是保障数据传输安全与身份认证的核心技术,其典型代表RSA算法通过公钥与私钥的配对实现加密与签名。在Java工程实践中,开发者常封装RSAUtils工具类以简化调用,但若未深入理解其原理与实现细节,极易引发线上故障。密钥格式混淆(如PKCS#1与PKCS#8)、数据长度超限导致的异常、以及Cipher实例的线程安全问题,是三大常见陷阱。本文聚焦2048位RSA密钥,解析密钥全生命周期管理、健壮的加解密实现,并针对数据超长场景,引入混合加密方案,旨在将RSA工具类从“隐患”转化为生产级可靠组件。

weixin_30765505的博客 533

中小团队API密钥管理实战:基于Taotoken的统一安全方案

在软件开发和运维领域,API密钥、数据库密码等敏感信息的管理是基础且关键的安全环节。其核心原理在于实现敏感数据的集中化、加密化存储与细粒度访问控制,从而避免因硬编码、配置文件泄露或权限混乱导致的安全风险。这项技术的核心价值在于将安全左移,通过统一平台管理所有密钥的生命周期,显著提升整体安全水位与运维效率。其典型应用场景包括微服务架构下的配置分发、多环境密钥隔离、CI/CD流水线集成以及满足安全审计合规要求。本文以轻量级密钥管理工具Taotoken为例,深入剖析了如何为中小团队设计并落地一套完整的密钥管理体系

weixin_30598225的博客 337

基于Spring Boot的网上订餐系统毕设完整实践指南

每一个管理类系统的开发都离不开成熟的后端框架与数据库设计。Spring Boot作为Java生态中主流的快速开发框架,通过自动配置与起步依赖简化了项目搭建;而MySQL关系型数据库则为订单、用户、菜品等核心数据提供了稳定存储。两者结合,使得网上订餐系统这类经典毕业设计能够清晰串联起用户端、商家端与管理后台的完整业务链路。围绕购物车、订单状态流转、权限拦截等关键环节,开发者需要理解实体分层、事务回滚和并发扣库存等工程实践。通过合理的数据库表设计与状态机定义,系统不仅实现了从点餐到配送的全流程管理,更充分体现了

cmff98425的博客 439

debian mirrors 镜像源 riscv 64 赛昉 星光 starfive vf2 InRelease‘ doesn‘t support architecture ‘riscv64‘

debian mirrors 镜像 riscv 64 赛昉 星光2 starfive vf2 InRelease' doesn't support architecture 'riscv64'

qq_29758759的博客 1259

CST入门——0. 安装CST Studio Suite 2022

安装CST Studio Suite 2022详细操作步骤

plmxu34的博客 6万+

Linux USB Gadget框架解析:从设备模拟到驱动开发实战

USB(通用串行总线)是现代计算机系统中应用最广泛的外设连接标准,其主从动态切换的特性使其在嵌入式系统中扮演着双重角色。与I2C、SPI等固定主从架构不同,USB设备需要同时支持主机(Host)和从机(Device)两种模式,这催生了Linux内核中独特的USB Gadget框架。该框架通过分层设计,将硬件控制器驱动(UDC)、功能逻辑(Function)和配置管理(Configfs)解耦,实现了灵活的设备模拟能力。在工程实践中,开发者可以利用Gadget框架快速实现U盘、网络适配器、串口转换器等常见USB

weixin_28007513的博客 563

ROS激光雷达动态避障算法优化(C++实战)

本文深入探讨了ROS激光雷达动态避障算法的C++实战优化。针对动态环境的核心挑战,文章系统性地介绍了从激光数据预处理(降噪、瘦身)、动态障碍物检测与跟踪,到基于动态窗口法(DWA)的智能决策与调优的全流程。重点分享了如何将障碍物速度预测融入DWA打分函数,以实现更安全、流畅的避障,并提供了工程架构、性能优化及真机调试的实用建议。

weixin_29192141的博客 948

命令行执行YOLO训练命令报错:1.PermissionError: [WinError 5] 拒绝访问 2.OMP: Error#15: Initializing libiomp5md.dll...

(已解决!)报错:1.PermissionError: [WinError 5] 拒绝访问 2.OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

Gpengyuyan的博客 1126

INMP441麦克风与ESP32的I2S音频采集实战指南

本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。

weixin_28396629的博客 599

Python开发MCP Client

全部例子只是MCP Client访问MCP Server的过程,那么这样其实就失去了MCP协议的创建的初衷,和大模型集成后才能发挥MCP最大的作用。

Criss@陈磊 2973

Nvidia Driveos SDK/PDK介绍

NVIDIA DRIVEOS SDK/PDK介绍

u011803281的博客 2178

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 使用redis碰到maxmemory
下一篇: 不改一行代码将servlet工程改造成springboot工程
CommanderZero
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值