Dropwizard 环境变量替换类型检查错误



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

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

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类,并委托给具有loggingEnabled属性布尔字段的DownstreamServiceConfiguration类。我是根据Dropwizard Core文档执行此操作的。

我的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?

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

问题不在于我的布尔DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED环境被视为字符串,问题在于布尔 YML 属性没有正确连接,因此它找到的字符串值不是字符串文字,true。相反,它是字符串文字${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED}。基本上,Dropwizard一开始并没有用${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED}代替true

解决方案涉及两件事:

  1. 调用从我的start.sh脚本实际创建环境变量的脚本。我实际上忘记了这样做。咚!
  2. 根据此答案,将应用程序的引导程序配置为使用EnvironmentVariableSubstitutor。请注意,您无需将EnvironmentVariableSubstitutor设置为使用非严格检查,Dropwizard 不会无条件地将 shell 变量解释为字符串。需要将以下代码添加到主应用程序类中。

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

这两件事结合起来解决了这个问题。

相关内容

最新更新