当前位置:坤哥网-kwan-记一次 spring boot 项目编译正常,但启动报错:Circular placeholder reference 'xx.xx' in property definitions 解决

记一次 spring boot 项目编译正常,但启动报错:Circular placeholder reference 'xx.xx' in property definitions 解决

2022/4/25 17:25:18 IT综合阅读(196) 评论(2)

问题描述

今天启动下公司之前拉下来的项目,编译正常,但运行报错:

Caused by: java.lang.IllegalArgumentException: 
Circular placeholder reference 'server.port' in property definitions

问题分析

看报错是配置的问题,检查配置都是正常的,不过配置 'server.port' 是这样使用的:

server:
  port: ${server.port}

那就是取不到 Apollo 这个配置,本地的 Apollo 配置文件也正常:

env=DEV
idc=default

Apollo 管理界面上对应环境和命名空间看这个配置也在。到底什么原因?调试没发现什么异常。代码是之前从git上下载下来的,也没修改过,也更新了当前分支。让同事本地运行却正常,可我们本地网络环境是一样的。

问题解决

继续调试好久。。。。

最后偶然发现一个警告,发现一直连不上 Apollo:

[      main] WARN  com.ctrip.framework.apollo.internals.DefaultConfig:95 
- Could not load config for namespace application from Apollo, 
please check whether the configs are released in Apollo! Return default value now!

以为 Apollo 管理界面能访问,而且同事也能正常运行,就从没注意 Apollo 会连不上。

如果连不上,那为啥同事运行正常?

哦,原来是当连不上时会使用的 Apollo 缓存,而我之前从没运行过,本地缓存就是空的,把同事的本地缓存,复制到我本地,运行正常了。

20220425154450

总结

浪费不少时间去调试代码,以为很诡异,一直在抱怨怎么老遇到这么奇怪的问题,找同事也解决不了,后面只能自己找各种方法,仿佛自己就陷进去了。

但在程序的世界里报错必然有原因,如果一直查不到,说明自己对这块不够熟悉!一定要具体分析,不要盲目地去找原因:

  1. 同样的代码别人电脑上运行正常,你运行失败,那说明不是代码本身问题,就没必要去看代码是不是写的对不对

  2. 报错是配置问题,把配置写死,这个配置就不报错,继续报下一个这种配置使用的错误,说明就是这些配置都取不到了

  3. 检查配置用的是 Apollo,管理界面本地能访问,不代表服务就能访问,应检查调试信息是不是有提示连不上的警告或错误。如果是的话,为啥之前能连上,结合实际情况,如本次公司刚好调整了网络策略(很多系统都访问不了了),这个时候就应该能确定是网络原因了

  4. 基于第3点,为啥同事能访问,这时应考虑他本地是不是有缓存,Apollo 是支持缓存的

  5. 如果上面都不是,再来调试进入代码看具体调试信息来检查本地环境问题

见笑了,特此记录!


分类: 技术问题记录

有话要说? =>【不用注册,直接登录】,然后刷新本页面来发表您的观点(●'◡'●)