关于Could not resolve placeholder 'foo' in value "${foo}"的问题

本文记录了一次使用 Spring Cloud Config 进行服务配置时遇到的问题及解决过程。作者在启动客户端时遇到配置解析错误,通过对比官方示例和调整服务端口解决了问题,并分享了排查思路。

今天参考spring cloud config配置写了一个service和client,启动client的时候报错:

 

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'foo' in value "${foo}"
	at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:236) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:172) ~[spring-context-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:831) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1086) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	... 17 common frames omitted


奇怪了,我和网上的demo写的差不多都一样啊,除了端口号还有一些其他的,然后下载他demo运行了一下,他的运行没问题,然后把我写的和他对比了一下,不会是端口号吧……把config-service的端口号改为8888,问题解决……

 

 

个人感觉应该是client-conf客户端这块应该有些地方没配置,如果service-config那块端口号不是8888的话。

 

补充一下,如果你的服务端的端口号写的是默认的8888的话,还有问题,那就可能是你client配置的端口号被占用了,window下cmd里命令netstat,查看端口号是否被占用

 

如果有朋友知道上述问题的其他解决方案,希望留下你的解答

### 关于Spring Placeholder无法解析的问题 当遇到`placeholder could not resolve placeholder in value ${}` 的问题时,通常是因为占位符未被正确替换为实际值。以下是可能的原因及其解决方案: #### 原因分析 1. **PropertyPlaceholderConfigurer加载顺序问题** 如果项目中有多个`PropertyPlaceholderConfigurer`实例,可能会导致某些bean在占位符解析之前就被创建。这会使得这些bean中的占位符无法被正确解析[^2]。 2. **资源文件路径不正确** 占位符的值来源于配置文件(如`.properties`),如果指定的资源配置文件路径有误或者文件不存在,则会导致占位符无法解析。 3. **上下文中缺少必要的配置器** 虽然可以使用`PropertyPlaceholderConfigurer`来处理占位符,但如果系统属性始终存在,也可以依赖Spring内置的`ResourceEditor`完成占位符替换工作[^1]。 4. **注解方式下的特殊行为** 使用`@Value("${...}")`注入占位符时,可能存在解析失败的情况。例如,在某些场景下`${db.driver}`会被直接打印出来而不是其对应的值[^3]。 #### 解决方案 ##### 方法一:调整PropertyPlaceholderConfigurer的加载时机 可以通过设置`ignoreUnresolvablePlaceholders=true`让程序忽略那些暂时无法解析的占位符,从而避免启动阶段报错。另外,确保所有的`PropertyPlaceholderConfigurer`都在其他bean初始化前执行完毕。 ```java @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() { return new PropertySourcesPlaceholderConfigurer(); } ``` ##### 方法二:验证并修正.properties文件位置 确认项目的classpath中确实包含了所需的`.properties`文件,并且路径声明无误。例如: ```xml <context:property-placeholder location="classpath*:application.properties"/> ``` ##### 方法三:采用Environment接口替代硬编码 利用Spring提供的`Environment`抽象类动态获取环境变量或配置项,这种方法更加灵活可靠。 ```java @Autowired private Environment env; public String getDbDriver(){ return env.getProperty("db.driver"); } ``` ##### 方法四:检查自动装配逻辑 对于需要强制赋值的字段,推荐优先考虑`@Autowired(required=false)`而非`@Required`注释,因为后者要求必须提供具体实现,否则抛出异常;而前者允许为空情况发生[^4]。 --- ### 示例代码展示 下面给出一段完整的示例代码用于演示如何正确配置以及访问数据库驱动名: ```java @Configuration @PropertySource("classpath:database.properties") public class DatabaseConfig { @Autowired private Environment environment; public void printDatabaseInfo(){ System.out.println(environment.getProperty("db.driver")); } } // database.properties 文件内容如下: db.driver=oracle.jdbc.driver.OracleDriver ``` ---
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值