idea设置Spring boot工程环境变量后,启动报错(Circular placeholder reference)

本文介绍了当使用Spring框架配置属性时出现循环引用错误的具体原因及解决方案。主要针对因属性文件配置不当导致的Caused by: java.lang.IllegalArgumentException: Circular placeholder reference 'canal.host'异常,并提供了解决该问题的正确做法。
部署运行你感兴趣的模型镜像

1.      初始设置

 


2.      启动报错

Caused by: java.lang.IllegalArgumentException: Circular placeholder reference 'canal.host' in property definitions

              atorg.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:139)

              at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:160)

              atorg.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)

              atorg.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:237)

              atorg.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:211)

              atorg.springframework.core.env.AbstractPropertyResolver.resolveNestedPlaceholders(AbstractPropertyResolver.java:228)

              atorg.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:88)

              atorg.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:62)

3.      原因

properties文件中左右两边的变量名相同

 

4.      措施

修改properties文件,使左右两边的变量名不相同。


您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

在编程中,特别是在使用模板引擎或依赖注入框架时,可能会遇到 **"Circular placeholder reference"** 错误。这种错误通常发生在尝试解析配置或模板时,系统检测到某个占位符引用了自身,或者多个占位符之间形成了循环依赖。 ### 常见原因 1. **占位符自我引用**: 某个变量在定义时直接引用了自己。 ```properties app.url=${app.url}/api ``` 上述配置会导致解析器在尝试替换 `${app.url}` 时进入无限递归,最终抛出循环引用异常。 2. **间接循环引用**: 多个变量相互引用,形成一个闭环。 ```properties app.home=${app.user.home} app.user.home=${app.home} ``` 3. **Spring 框架中的占位符循环引用**: 在 Spring 的 `application.properties` 或 `application.yml` 中,如果 `@Value` 注解引用的属性之间形成循环依赖,也会报错。 ### 解决方案 1. **检查并修正配置文件**: 确保所有占位符引用的变量都已正确定义,并且没有形成循环依赖。可以通过代码审查或静态分析工具来识别潜在问题。 2. **使用默认值**: 在引用占位符时提供默认值可以避免循环引用问题。 ```properties app.url=${other.url:/default/path} ``` 3. **重构配置结构**: 如果多个属性之间存在复杂的依赖关系,考虑将它们合并或拆分成更清晰的结构,以避免循环引用。 4. **延迟解析机制**: 在某些框架中(如 Spring),可以利用 `LazyResolutionPropertyValueResolver` 或自定义 `PropertySource` 来延迟解析占位符,从而避免在初始化阶段发生循环引用。 5. **使用编程方式处理依赖**: 在 Java 中,如果使用 Spring,可以通过 `@PostConstruct` 方法手动设置依赖关系,而不是直接在 `@Value` 中使用复杂表达式。 ```java @Component public class AppConfig { @Value("${app.home}") private String home; @Value("${app.user.home}") private String userHome; @PostConstruct public void init() { if (home == null) { home = userHome + "/default"; } } } ``` 6. **调试工具和日志**: 启用详细的日志输出可以帮助定位循环引用的具体位置。例如,在 Spring 中可以启用 `debug` 模式查看属性解析过程。 ```yaml logging: level: org.springframework: DEBUG ``` 7. **使用环境变量替代配置文件**: 在某些情况下,通过环境变量注入配置可以绕过配置文件中的循环引用问题。 ### 示例:Spring Boot 中的解决方案 假设在 `application.properties` 中有如下配置: ```properties app.root=${app.home}/app app.home=${app.root}/user ``` 这将导致 Spring启动报错。解决方法之一是引入一个中间变量: ```properties app.base=/opt/myapp app.home=${app.base}/user app.root=${app.home}/app ``` 这样就避免了循环引用问题。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ability Liao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值