我可以在DropWizard中拥有多个配置文件吗?

时间:2015-02-25 18:50:15

标签: java dropwizard

我想为DropWizard提供几个yaml文件。其中一个包含敏感信息,另一个包含非敏感信息。

你能指点我在DropWizard中如何使用多个配置的文档或示例吗?

3 个答案:

答案 0 :(得分:8)

ConfigurationSourceProvider是你的答案。

bootstrap.setConfigurationSourceProvider(new MyMultipleConfigurationSourceProvider());

以下是dropwizard does it by default的方法。您可以根据自己的喜好轻松更改它。

public class FileConfigurationSourceProvider implements ConfigurationSourceProvider {
    @Override
    public InputStream open(String path) throws IOException {
        final File file = new File(path);
        if (!file.exists()) {
            throw new FileNotFoundException("File " + file + " not found");
        }

        return new FileInputStream(file);
    }
}

答案 1 :(得分:5)

首先,您将在.yml中编写另一个yml文件路径。

sample.yml

configPath: /another.yml

another.yml

greet: Hello!

只需使用SnakeYaml即可解决。

public void run(SampleConfiguration configuration, Environment environment) {
    Yaml yaml = new Yaml();
    InputStream in = getClass().getResourceAsStream(configuration.getConfigPath());
    AnotherConfig anotherConfig = yaml.loadAs(in, AnotherConfig.class);
    String str = anotherConfig.getGreet(); // Hello!
...
}

对于敏感信息,我认为使用环境变量是好的。

例如,使用dropwizard-environment-config
https://github.com/tkrille/dropwizard-environment-config

答案 2 :(得分:5)

理想情况下,您应该通过将敏感信息或可配置数据放在环境变量中来配置应用,而不是管理多个文件。请参阅配置中的十二个因子规则:http://12factor.net/config

要在Dropwizard中启用此方法,您可以使用-Ddw标志在运行时使用环境变量覆盖您的配置:

java -Ddw.http.port=$PORT -jar yourapp.jar server yourconfig.yml

或者你可以使用这个方便的添加:https://github.com/tkrille/dropwizard-template-config将环境变量占位符放在你的配置中:

server:
  type: simple
  connector:
    type: http
    # replacing environment variables
    port: ${env.PORT}

上述两种解决方案都与Heroku和Docker容器兼容,其中环境变量仅在您运行应用程序时可用。