如何为需自定义参数注入的Spring Boot控制台应用打包及运行传参
问题原因
构建报错是因为Spring上下文初始化时(包含Maven打包阶段默认执行的单元测试环节)会强制解析${param.date}占位符,你没有在构建阶段的配置中提供该参数值,也没有设置占位符默认值,因此抛出解析失败异常。
解决构建报错方案
你可以根据自身需求选择任意一种方案:
- 方案1:给占位符添加默认值,仅修改
@Value注解写法即可,无需其他改动:
// 写法1:设置固定默认值,运行时不传参就使用默认值 @Value("#{new java.text.SimpleDateFormat('dd-MM-yyyy').parse('${param.date:01-01-2024}')}") private Date date; // 写法2:如果要求运行时必须传参,不需要实际默认值,可以留空默认值,构建阶段不会报错,运行时不传才会触发启动失败 @Value("#{new java.text.SimpleDateFormat('dd-MM-yyyy').parse('${param.date:}')}") private Date date;
- 方案2:给测试环境配置专用默认参数,在
src/test/resources/application.properties中添加测试用的参数值,不会影响生产运行逻辑:
param.date=01-01-2024
- 方案3:打包时跳过单元测试,执行构建命令时添加跳过测试参数即可:
mvnw package -DskipTests
运行时传参方式
Jar包构建完成后,两种常用传参方式都可以正常注入param.date的值:
- 方式1:使用Spring Boot专用的命令行参数传值,优先级最高,会覆盖配置文件中的同名配置:
java -jar your-app.jar --param.date=15-08-2024
- 方式2:使用JVM系统参数传值:
java -Dparam.date=15-08-2024 -jar your-app.jar
优化建议
你可以使用Spring Boot自带的类型转换能力简化代码,无需手动编写SpEL解析日期:
- 定义配置属性类:
@ConfigurationProperties(prefix = "param") public class ParamProperties { // Spring Boot会自动按照指定格式将字符串转换为Date类型 @DateTimeFormat(pattern = "dd-MM-yyyy") private Date date; // 省略getter、setter方法 }
- 在启动类上添加
@EnableConfigurationProperties(ParamProperties.class)注解,之后直接注入ParamProperties实例即可读取对应字段。
内容的提问来源于stack exchange,提问作者Logos
相关产品推荐
相关产品推荐

