我是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?
答案 0 :(得分:1)
经过一些谷歌搜索后,我找到了我的问题的解决方案,并认为我会在这里与其他人分享我的答案,并且我得到了同样的错误信息。
问题不在于我的布尔DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED
环境被视为字符串,问题是布尔YML属性刚刚没有正确连接,所以它找到的字符串值不是字符串文字true
。相反,它是字符串文字${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED}
。基本上,Dropwizard首先没有用${DW_DOWNSTREAM_SERVICE_LOGGING_ENABLED}
代替true
。
解决方案涉及两件事:
start.sh
脚本中调用实际创建环境变量的脚本。我实际上忘记了这样做。卫生署!根据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()));
}
这两件事合起来解决了这个问题。