异常:java.lang.IllegalArgumentException: Could not resolve placeholder 'xxx' in value "${xxx}"

一开始以为又是下划线的原因,后来才发现,原来应用名和yml配置的文件需要命名一致才行。

开端:

打算通过客户端访问服务端,服务端访问github配置文件的方式,使client客户端动态获取github上配置信息。

我通过git bash一共上传了两个yml配置文件到github,一个是服务端配置文件,另一个是客户端配置文件。

其中客户端yml配置文件的命名不正确,与在eclipse中yml声明的不一致,结果就是它导致了客户端的yml失效。

测试:

测试的时候,服务端启动正常,并且可以正常访问github上的服务端yml,因为服务端的命名正确,但是客户端就无法获得配置文件的内容。

测试类里通过注解获得配置文件的参数:

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${eureka.client.service-url.defaultZone}")//就是这里无法获得github上yml配置文件参数,可以想象得到,是yml文件错误或失效。
    private String eurekaServers;

客户端启动,由于无法获得github上配置文件的参数,它报无效参数异常了;

Caused by: java.lang.IllegalArgumentException: 
Could not resolve placeholder 'eureka.client.service-url.defaultZone' in value "${eureka.client.service-url.defaultZone}"

为什么我知道一定是参数没有被获取呢?因为启动客户端时,端口号没有从github上的yml文件中动态获取,同时它报了这个错。

排查:

我确认所有的代码都没有问题,包括配置文件的内容,pom依赖,启动类,测试类都没有问题。

那么只剩下排查配置文件命名是否正确了,原来是yml配置文件的命名还有讲究,不是随便写,而是要对应写才行。

总结;

由于客户端的端口号配置在github上的yml里,而对应的yml文件名称又没有写对,结果整个失效的yml配置文件就无法提供内部各种参数,

这导致了测试类中通过value注解注入到spring里的配置文件参数无法被获得,结果就报了这种异常。

原来并不是下划线惹的祸,而是命名不一致造成的,今天我竟然错怪了下划线。

至于ribbon,它的应用名的确不支持下划线。

原文地址:https://www.cnblogs.com/timingstarts/p/12720218.html