Circular placeholder reference
🏷️ Spring Boot
今天准备把两个配置项修改为支持环境变量,所以在配置文件中添加了如下配置:
yaml
ce-shi:
domain: ${ceshi.domain:liujiajia.me}
apikey: ${ceshi.apikey:g46e4u8tqyj4u0jvutm05odd7xyn8lus}
结果服务启动报错了,说是绑定异常。
java
org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'ceshi.apikey' to java.lang.String
仔细查看后面的日志才发现真正的原因:占位符循环引用了。
java
Caused by: java.lang.IllegalArgumentException: Circular placeholder reference 'ceshi.apikey:g46e4u8tqyj4u0jvutm05odd7xyn8lus' in property definitions
也就是说配置文件中 ce-shi.apikey 和 SpEL 中的占位符 ceshi.apikey 重复了,导致了循环引用。
可以看出 Spring 在匹配时优先匹配的是配置文件中的配置项,而且匹配时去除了特殊符号,之后在配置文件中找不到对应项时,才会在环境变量中匹配。
解决办法很简单,将占位符修改为不一样的就可以了。
yaml
ce-shi:
domain: ${cs.domain:liujiajia.me}
apikey: ${cs.apikey:g46e4u8tqyj4u0jvutm05odd7xyn8lus}