如何在yml中获取我的配置值 – 使用dropwizard(microservice)Jersey DI @Injection?

这是我的代码片段。

这是我的yml文件:

productionServer: host: production-server.amazonaws.com publicIp: xx.xx.xx.xx privateIp: xx.xx.xx.xx userName: xx.xx.xx.xx password: xx.xx.xx.xx remoteFilePath: fake/path/ fileName: test.txt privateKey: private-public-key.ppk server: applicationConnectors: - type: http port: 8080 - type: https port: 8443 keyStorePath: key.keystore keyStorePassword: password validateCerts: false adminConnectors: - type: http port: 8081 - type: https port: 8444 keyStorePath: key.keystore keyStorePassword: password validateCerts: false 

MyConfiguration类:

 import io.dropwizard.Configuration; public class MyConfiguration extends Configuration{ @NotNull @JsonProperty private ProductionServer productionServer; // getters public class ProdctionServer{ @NotEmpty @JsonProperty private host; @NotEmpty @JsonProperty private publicIp; // getters 

申请类:

 import io.dropwizard.Application; public class MyApplication extends Application { public static void main(String[] args) throws Exception{ new MysApplication().run(args); } @Override public String getName(){ return "micro-service"; } @Override public void initialize(Bootstrap bootstrap){} @Override public void run(MyConfiguration conf, Environment environment ){ final MyResource myResource = new MyResource(); // health check // environment.healthChecks().register("template",healthCheck); System.out.println( "==> " + conf ); System.out.println( "==> " + conf.getProductionServer() ); // register environment.jersey().register( MyResource ); 

并在运行此应用程序时:

我收到了如下记录:

 ==> MyConfiguration{server=DefaultServerFactory{applicationConnectors=[io.dropwizard.jetty.HttpConnectorFactory@623e088f, io.dropwizard.jetty.HttpsConnectorFactory@39fcbef6], adminConnectors=[io.dropwizard.jetty.HttpConnectorFactory@34f22f9d, io.dropwizard.jetty.HttpsConnectorFactory@77d67cf3], adminMaxThreads=64, adminMinThreads=1, applicationContextPath=/, adminContextPath=/}, logging=DefaultLoggingFactory{level=INFO, loggers={}, appenders=[io.dropwizard.logging.ConsoleAppenderFactory@663411de]}} ==> com.mycompany.myproject.model.ProductionServer@5b04476e 

这意味着它成功地获得了我的yaml的价值。 但我的问题是在MyConfiguration类的DI或dependency injection期间。 虽然在我的服务中Object MyConfiguration似乎不为null,但我无法获得我的ProductionServer的值。

这是依赖绑定MyService.class和MyConfiguration.class的代码片段

DependencyBinder.class

import org.glassfish.hk2.utilities.binding.AbstractBinder;

公共类DependencyBinder扩展AbstractBinder {

 @Override protected void configure() { bind(MyConfiguration.class).to(MyConfiguration.class); bind(MyService.class).to(MyService.class); } 

MyService.class

 public class MyService { @Inject MyConfiguration conf; public void invoke(){ System.out.println( "=============================== " ); System.out.println( "==> " + conf ); System.out.println("==> " + conf.getProductionServer() ); } 

并且在调用方法invoke()期间…我得到了如下记录:

 =============================== ==> MyConfiguration{server=DefaultServerFactory{applicationConnectors=[io.dropwizard.jetty.HttpConnectorFactory@34e82c4d], adminConnectors=[io.dropwizard.jetty.HttpConnectorFactory@19b70fbd], adminMaxThreads=64, adminMinThreads=1, applicationContextPath=/, adminContextPath=/}, logging=DefaultLoggingFactory{level=INFO, loggers={}, appenders=[io.dropwizard.logging.ConsoleAppenderFactory@543f81c9]}} ==> null 

现在我的问题是在MyService.class中的MyConfiguration类的DI或dependency injection期间。 虽然在我的服务中Object MyConfiguration似乎不为null,但我无法获得我的ProductionServer的值。 请给我一些解决方案? 日Thnx。

问题是,这种配置

 bind(MyConfiguration.class).to(MyConfiguration.class); 

HK2将创建MyConfiguration的新实例。 它不会是DW填充的同一个实例。 但是,您可以使用DW创建的实例,只需在HK2配置中绑定相同的实例即可

 public class MyApplication extends Application { @Override public void run(final MyConfiguration config, Environment env) { env.jersey().register(new AbstractBinder() { @Override protected void configure() { bind(config).to(MyConfiguration.class); } }); } }