一次艱難的spring boot自定義配置問題

出發點

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章