2017-04-12 11 views
1

我是一個Dropwizard新手,並且正在使用現有的Dropwizard服務,我嘗試創建YML值,這些值根據我的服務部署到的環境(即Dev,QA ,Prod)。我試着用谷歌搜索我的錯誤信息,但是對於這個特定的錯誤並沒有發現很多,所以我想我會爲此發佈一個新問題。Dropwizard Enviornment變量替換類型檢查錯誤

當我運行我的腳本,啓動服務,我得到以下錯誤:

my-host:my-service jthoms$ ./start.sh 3.0.0 
Starting my-service... 
src/main/resources/configuration.yml has an error: 
    * Incorrect type of value at: downstream_service.loggingEnabled; is of type: String, expected: boolean 

請注意,我已經創建了MyServiceConfiguration類延伸Dropwizard的主要Configuration類,並委託給具有DownstreamServiceConfigurationloggingEnabled屬性的布爾型字段。我按照Dropwizard Core doc這樣做了。

start.sh腳本如下:

#!/bin/sh 

if [ "$#" -ne 1 ]; then 
    echo "Please pass jar version! Usage: ./start.sh <jar_version>" 
    exit 1 
fi 

echo "Starting my-service with version '$1'" 

java $DEBUG_ARGS -Xmx128m -jar target/my-service-$1.jar server src/main/resources/configuration.yml 

configuration.yml如下:

server: 
    ... 
downstream_service: 
    loggingEnabled: ${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED} 
    ... 
logging: 
    ... 

我不明白是什麼導致了這種類型的安全錯誤。如何將我的環境變量作爲非字符串類型導入Dropwizard?

回答

0

經過一番谷歌搜索後,我找到了解決方案,並認爲我會與其他人分享我的答案,並提供相同的錯誤消息。

問題不是我的布爾DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED環境被視爲一個字符串,問題是布爾YML屬性只是沒有正確連接,所以它找到的字符串值不是字符串文字,true。相反,它是字符串文字${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED}。基本上,Dropwizard首先並沒有用${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED}代替true

該解決方案包括兩個部分:

  1. 呼叫,實際上從我start.sh腳本創建環境變量的腳本。我其實已經忘記這麼做了。衛生署!
  2. 按照this answer配置應用程序的引導以使用EnvironmentVariableSubstitutor。請注意,您不需要將EnvironmentVariableSubstitutor設置爲使用non-strict checking,因此shell變量並未被Dropwizard無條件地解釋爲字符串。以下代碼需要添加到主應用程序類中。

    @Override 
    public void initialize(Bootstrap<MyServiceConfiguration> bootstrap) { 
        bootstrap.setConfigurationSourceProvider(
          new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), 
            new EnvironmentVariableSubstitutor())); 
    } 
    

這兩件事情結合解決了這個問題。