我是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
。
解决方案涉及两件事:
- 调用从我的
start.sh
脚本实际创建环境变量的脚本。我实际上忘记了这样做。咚! -
根据此答案,将应用程序的引导程序配置为使用
EnvironmentVariableSubstitutor
。请注意,您无需将EnvironmentVariableSubstitutor
设置为使用非严格检查,Dropwizard 不会无条件地将 shell 变量解释为字符串。需要将以下代码添加到主应用程序类中。@Override public void initialize(Bootstrap<MyServiceConfiguration> bootstrap) { bootstrap.setConfigurationSourceProvider( new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), new EnvironmentVariableSubstitutor())); }
这两件事结合起来解决了这个问题。