Spring @ConfigurationProperties如何同时兼容Long与Double类型?
问题:Spring Boot配置绑定0.5数值失败的解决办法
我的YAML配置文件
collie: crontask: command: echo ok intervalInMinute: 0.5
对应的Java配置类
@Configuration @ConfigurationProperties(prefix = "collie.crontask") @Data public class CronTaskConfig { private String command; private Long intervalInMinute; public void setIntervalInMinute(String intervalInMinute) { this.intervalInMinute = Long.parseLong(intervalInMinute); } }
报错信息
Failed to bind properties under 'collie.crontask' to com.xx.union.collie.worker.config.CronTaskConfig$$EnhancerBySpringCGLIB$$e4948fd7:
Property: collie.crontask.intervalinminute Value: 0.5 Origin: class path resource [application.yaml]:45:23 Reason: For input string: "0.5"Action:
Update your application's configuration
org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'cronTaskConfig': Could not bind properties to 'CronTaskConfig'
将配置改为intervalInMinute: 1即可正常运行,显然是数值类型不匹配导致的问题,以下是几种解决方式:
方案1:修改setter方法接收浮点类型并转Long
直接调整setter方法的参数类型为Double,再根据业务需求把浮点值转成Long类型(比如取整、转成毫秒/秒等):
@Configuration @ConfigurationProperties(prefix = "collie.crontask") @Data public class CronTaskConfig { private String command; private Long intervalInMinute; // 接收Double类型的配置值,再转成Long public void setIntervalInMinute(Double intervalInMinute) { // 示例:直接取整,0.5会转成0;如果需要转成秒则用 (long)(intervalInMinute * 60) this.intervalInMinute = intervalInMinute.longValue(); } }
方案2:调整字段含义,用整数表示时间单位
如果0.5分钟实际对应30秒,可以直接把配置改成整数,同时修改字段名更贴合实际含义,避免浮点转换问题:
YAML配置修改为:
collie: crontask: command: echo ok intervalInSecond: 30
Java类修改为:
@Configuration @ConfigurationProperties(prefix = "collie.crontask") @Data public class CronTaskConfig { private String command; private Long intervalInSecond; }
方案3:使用@NumberFormat注解解析数值
如果不想改动字段类型,可借助Spring的@NumberFormat注解实现浮点字符串到Long的转换:
@Configuration @ConfigurationProperties(prefix = "collie.crontask") @Data public class CronTaskConfig { private String command; @NumberFormat(style = NumberFormat.Style.NUMBER) private Long intervalInMinute; }
内容的提问来源于stack exchange,提问作者dreamck
相关产品推荐
相关产品推荐

