2016-03-09 38 views
5

ecco i frammenti di codice.come ottenere i valori di configurazione in yml - utilizzando dropwizard (microservice) Jersey D.I @ Injection?

ecco il mio file 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 

classe 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 

classe Application:

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

e durante l'esecuzione di questa applicazione:

ho ricevuto un collegato come 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] 

significa che si ottiene correttamente il valore del mio yaml. ma il mio problema è durante l'iniezione D.I o dipendenza della classe MyConfiguration. non riesco a ottenere il valore del mio ProductionServer sebbene Object MyConfiguration non sia nullo nel mio servizio.

Ecco il mio frammento di codice di dipendenza vincolante del MyService.class e la MyConfiguration.class

DependencyBinder.class

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

public class DependencyBinder estende 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()); 
    } 

e durante l'invocazione del metodo invoke() ... ho ottenuto un collegato come segue:

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

ora il mio problema è durante il DI o dipendenza inec zione della classe MyConfiguration in MyService.class. non riesco a ottenere il valore del mio ProductionServer sebbene Object MyConfiguration non sia nullo nel mio servizio. per favore dammi qualche risoluzione? thnx.

risposta

4

Il problema è, con questa configurazione

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

HK2 creerà una nuova istanza del MyConfiguration. Non sarà la stessa istanza popolata da DW. Che cosa si può fare, però, è utilizzare l'istanza creato da DW, semplicemente vincolante che stessa istanza nella configurazione 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); 
      } 
     }); 
    } 
}