出发点
我想要在项目中配置一个跨域,其中跨域的的域名,我希望根据不同的profile使用不同的域名,这样部署的时候就不用改了。出于这个目的,我在application配置文件中自定义了跨域的域名,然而我没想到的是,这个问题花了我一个小时才解决,记录一下,防止以后再犯这个错误。
初始配置
测试:dev.yml
test:
project:
origins:
- *
生产:product.yml
test:
project:
origins:
- http://test.project.com
- http://pre-test.project.com
使用的地方:
@Value("${test.project.origins}")
private String origins;
第一个错误
因为部署环境的问题,部署一次大概需要7-8分钟。
第一次部署的时候就报了错误:
原来的日志找不到了,大概如下:
test:
project:
origins:
- * // yaml语法报错
星号无法处理,这个符号在yaml语法中是特殊符号,我真的是没想到这个问题,因为之前配置spring boot的相关配置的时候见过星号。所以只能找yaml如何处理特殊字符的说明文档,然而没找到,只在博客中看到又说用小括号或者单引号的,如下:
test:
project:
origins:
- '*'
test:
project:
origins:
- (*)
因为时间问题,我没有尝试这种配置有没有问题,但是我没有采用这种配置方式,而是使用下面的配置:
test:
project:
origins:
- "*"
第二个错误
改成上面的配置后,我以为可以,结果再次尝试启动的时候,又报了下面这个错误:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'XXX' in value "${XXXt}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172)
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)
后来发现如果只是普通的自定义变量这样写是没问题的,但是如果是集合或者数这样写是会报错的,因为时间问题没有分析源码为什么会报错。我只好把配置改成配置类的形式如下:
@Configuration
@ConfigurationProperties(prefix = "test.project")
public class OriginsConfig {
private String[] origins;
public String[] getOrigins() {
return origins;
}
public void setOrigins(String[] origins) {
this.origins = origins;
}
}
使用的地方改为:
@Resource
private OriginsConfig originsConfig;
originsConfig.getOrigins();
这样就可以正常使用了。
总结
因为测试环境的问题,导致没测试一次就要花7-8分钟,本来以为一个小问题很快就解决了,实际上却花了一个多小时,下次再学习新知识的时候要注意细节,减少此类的出现。