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

2022-01-21 00:00:00 java jersey inject microservices dropwizard

这是我的代码片段.

这是我的 yml 文件:

here's my yml file:

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 类:

MyConfiguration class:

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 的值.

meaning it is successfully gets the value of my yaml. but my problem is during the D.I or dependency injection of MyConfiguration class. i cannot get the value of my ProductionServer though the Object MyConfiguration seems not null in my Service.

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

here's my code snippet of dependency binding the MyService.class and the MyConfiguration.class

DependencyBinder.class

DependencyBinder.class

导入 org.glassfish.hk2.utilities.binding.AbstractBinder;

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

公共类 DependencyBinder 扩展 AbstractBinder {

public class DependencyBinder extends AbstractBinder {

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

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()的过程中...我得到了如下记录:

and during the invoking of the method invoke()... i got a logged as follows:

=============================== 
==> 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 或依赖注入期间.尽管我的服务中的 Object MyConfiguration 似乎不为空,但我无法获取我的 ProductionServer 的值.请给我一些解决方案?谢谢.

now my problem is during the D.I or dependency injection of MyConfiguration class in MyService.class. i cannot get the value of my ProductionServer though the Object MyConfiguration seems not null in my Service. please give me some resolution? thnx.

推荐答案

问题是,这个配置

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

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

HK2 will create a new instance of the MyConfiguration. It will not be the same instance populated by DW. What you can do though, is use the instance created by DW, by simply binding that same instance in your HK2 configuration

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);
            }
        });
    }
}

相关文章