2016-03-09 10 views
5

Oto moje fragmenty kodu.jak zdobyć moje wartości konfiguracyjne w yml - używając dropwizard (microservice) Jersey D.I @Injection?

oto mój plik 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 

klasa 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 

klasa Zastosowanie:

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

i podczas uruchamiania tej aplikacji:

Otrzymałem zalogowany jako foll ows:

==> MyConfiguration{server=DefaultServerFactory{applicationConnectors=[[email protected], [email protected]], adminConnectors=[[email protected], [email protected]], adminMaxThreads=64, adminMinThreads=1, applicationContextPath=/, adminContextPath=/}, logging=DefaultLoggingFactory{level=INFO, loggers={}, appenders=[[email protected]]}} 
==> [email protected] 

oznacza, że ​​z powodzeniem otrzymuje wartość mojego yaml. , ale mój problem jest podczas D.I lub wstrzyknięcia zależności klasy MyConfiguration. nie mogę uzyskać wartości mojego serwera ProductionServer, chociaż obiekt MyConfiguration w mojej usłudze nie jest pusty.

oto mój kod urywek zależność wiązania MyService.class i MyConfiguration.class

DependencyBinder.class

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

public class DependencyBinder rozciąga 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()); 
    } 

i podczas powołując się na invoke() metoda ... Mam zalogowany następująco:

=============================== 
==> MyConfiguration{server=DefaultServerFactory{applicationConnectors=[[email protected]], adminConnectors=[[email protected]], adminMaxThreads=64, adminMinThreads=1, applicationContextPath=/, adminContextPath=/}, logging=DefaultLoggingFactory{level=INFO, loggers={}, appenders=[[email protected]]}} 
==> null 

teraz mój problem jest podczas DI lub zależność injec klasy MyConfiguration w MyService.class. nie mogę uzyskać wartości mojego serwera ProductionServer, chociaż obiekt MyConfiguration w mojej usłudze nie jest pusty. proszę dać mi jakieś rozwiązanie? thnx.

Odpowiedz

4

Problem polega na tym, ze tej konfiguracji

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

HK2 stworzy nową instancję MyConfiguration. To nie będzie ta sama instancja, w której znajduje się DW. Co ty może zrobić jest jednak użyć instancji utworzonego przez DW, po prostu wiązania że sama instancja w konfiguracji 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); 
      } 
     }); 
    } 
} 
Powiązane problemy