出發點
我想要在項目中配置一個跨域,其中跨域的的域名,我希望根據不同的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分鐘,本來以爲一個小問題很快就解決了,實際上卻花了一個多小時,下次再學習新知識的時候要注意細節,減少此類的出現。