2016-03-09 11 views
5

यहां मेरे कोड स्निपेट हैं।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); 

और जब इस अनुप्रयोग चल रहा है: मैं एक लॉग इन प्राप्त

अनुयायी के रूप में 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] 

जिसका अर्थ है कि यह सफलतापूर्वक मेरे यम का मूल्य प्राप्त हो जाता है। लेकिन मेरी समस्या डी.आई. या MyConfiguration कक्षा के निर्भरता इंजेक्शन के दौरान है। मुझे अपने प्रोडक्शनसेवर का मूल्य नहीं मिल सकता है, हालांकि ऑब्जेक्ट माई कॉन्फ़िगरेशन मेरी सेवा में शून्य नहीं है।

यहाँ MyService.class और MyConfiguration.class

DependencyBinder.class

आयात 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()); 
    } 

और वापस लाने() की प्रेरक दौरान ... मैं एक के रूप में लॉग इन किया गया इस प्रकार है:

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

अब मेरी समस्या DI या निर्भरता इंजेक के दौरान है MyService.class में MyConfiguration क्लास का टयन। मुझे अपने प्रोडक्शनसेवर का मूल्य नहीं मिल सकता है, हालांकि ऑब्जेक्ट माई कॉन्फ़िगरेशन मेरी सेवा में शून्य नहीं है। कृपया मुझे कुछ संकल्प दें? thnx।

उत्तर

4

समस्या इस विन्यास

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

HK2 MyConfiguration का एक नया उदाहरण पैदा करेगा के साथ, है। यह डीडब्ल्यू द्वारा आबादी वाला एक ही उदाहरण नहीं होगा। क्या आप कर सकते हैं हालांकि करते हैं, बस जुड़ कर 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); 
      } 
     }); 
    } 
} 
संबंधित मुद्दे