如何使用dropwizard(微服务)Jersey D.I@Injection在yml中获取我的配置值



这是我的代码片段。

这是我的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<MyConfiguration> {
    public static void main(String[] args) throws Exception{
        new MysApplication().run(args);
    }
    @Override
    public String getName(){ return "micro-service"; }
    @Override
    public void initialize(Bootstrap<MyConfiguration> 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类的D.I或依赖注入期间。虽然Object MyConfiguration在我的服务中似乎不为空,但我无法获得ProductionServer的值。

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

DependencyBinder.class

导入org.lassfish.hk2.实用程序.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类的D.I或依赖项注入过程中。尽管我的Service中的Object MyConfiguration似乎不为空,但我无法获得我的ProductionServer的值。请给我一些决议?thnx。

问题是,使用此配置

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

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

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

最新更新