Can I have multiple configuration files in DropWizard?

前端 未结 3 1554
独厮守ぢ
独厮守ぢ 2021-02-02 14:28

I want to have several yaml files for DropWizard. One of them contain sensitive info and one non sensitive.

Can you point me to any docs or example how to have multiple

相关标签:
3条回答
  • 2021-02-02 15:17

    Ideally you should be configuring your app by putting your sensitive information or configurable data inside Environment Variables, rather than managing multiple files. See twelve factor rule on config: http://12factor.net/config

    To enable this approach in Dropwizard, you can either override your config with Environment Variables at run time using the -Ddw flag:

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

    or you can use this handy add on: https://github.com/tkrille/dropwizard-template-config to put Environment Variable placeholders inside your config:

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

    Both of the above solutions are compatible with Heroku and Docker containers, where the Environment Variable are only available when you run the app.

    0 讨论(0)
  • 2021-02-02 15:24

    ConfigurationSourceProvider is your answer.

    bootstrap.setConfigurationSourceProvider(new MyMultipleConfigurationSourceProvider());
    

    The following is how dropwizard does it by default. You can easily change it to your own liking.

    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);
        }
    }
    
    0 讨论(0)
  • 2021-02-02 15:24

    Firstly, you will write another yml file path in a .yml.

    sample.yml

    configPath: /another.yml
    

    another.yml

    greet: Hello!
    

    and you will be solved by simply using the 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!
    ...
    }
    

    For sensitive information, I think it is good to use the environment variable.

    For example, use dropwizard-environment-config
    https://github.com/tkrille/dropwizard-environment-config

    0 讨论(0)
提交回复
热议问题