Dropwizard Enviornment变量替换类型检查错误

时间:2017-04-12 21:38:32

标签: java environment-variables config dropwizard

我是Dropwizard新手并使用现有的Dropwizard服务,我试图根据我的服务部署到的环境(即Dev,QA,Prod)创建可覆盖的YML值。我尝试使用Google搜索我的错误消息,但实际上没有找到这个特定错误的全部内容,所以我想我会为此发布一个新问题。

当我运行启动服务的脚本时,出现以下错误:

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类,并委托给DownstreamServiceConfiguration类,该类具有loggingEnabled属性的布尔字段。我按照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?

1 个答案:

答案 0 :(得分:1)

经过一些谷歌搜索后,我找到了我的问题的解决方案,并认为我会在这里与其他人分享我的答案,并且我得到了同样的错误信息。

问题不在于我的布尔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,因此,Dropwizard不会将shell变量无条件地解释为字符串。需要将以下代码添加到主Application类中。

    @Override
    public void initialize(Bootstrap<MyServiceConfiguration> bootstrap) {
        bootstrap.setConfigurationSourceProvider(
                new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(),
                        new EnvironmentVariableSubstitutor()));
    }
    
  3. 这两件事合起来解决了这个问题。