2016-05-01 10 views
11

मैं 2.5.3 करने के लिए 2.4 से एक Playframework आवेदन स्थानांतरित करने के लिए कोशिश कर रहा हूँ को महत्व देता है और मैं application.conf फ़ाइल से मूल्यों को प्राप्त करने के लिए समस्या है:प्ले 2.5.3: निर्भरता इंजेक्शन का प्रयोग विन्यास पाने के लिए

से पहले प्राप्त करने के लिए application.conf से के एक मूल्य था कि मुझे क्या करना:

Play.application().configuration().getString("label") 

अबPlay.application() नहीं रहेगी, मैं निर्भरता इंजेक्शन का उपयोग करना चाहिए।

  1. आयात परिभाषित करें:: आयात javax.inject.*; import play.Configuration;
  2. परिभाषित वर्ग संपत्ति: framework documentation मैं निम्नलिखित निर्देशों का उपयोग के आधार पर @Inject private Configuration configuration;
  3. मेरी कक्षा पर विन्यास वर्ग संपत्ति उपयोग

जब मैं अपने नियंत्रकपर इन निर्देशों का पालन करता हूंयह पूरी तरह से काम कर रहा है:

लेकिन जब मैं इसे अपने प्रोजेक्ट से किसी अन्य क्लास ऑब्जेक्ट पर उपयोग करने का प्रयास करता हूं, तो निर्भरता इंजेक्शन काम नहीं कर रहा है और मुझे हमेशा NullPointerException मिलता है।

क्या कोई मुझे निर्भरता इंजेक्शन का उपयोग करके application.conf से मूल्य प्राप्त करने के बारे में एक उदाहरण दे सकता है?

मेरी जावा कोड में से कुछ हिस्सा है जहाँ मैं डि इस्तेमाल करने की कोशिश:

import javax.inject.Inject; 
import play.Configuration; 
import play.Logger; 

public class Zipper { 

    @Inject private Configuration configuration; 

    public void unZip(String zipFilePath) { 
     Logger.debug("Display : zipFilePath"+zipFilePath); 
     Logger.debug("before call parameter from application.conf"); 
     Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path")); 
     Logger.debug("aftercall parameter from application.conf"); 
    } 
} 

और मैं हमेशा configuration.getString("Unzipedfile.path")

+1

पोस्ट कोड है कि काम नहीं कर रहा। – marcospereira

+0

मैंने अनुरोध के रूप में अद्यतन किया है।
उसी तरह का कोड मेरे नियंत्रक application.java पर काम कर रहा है, लेकिन मेरे अन्य जावा वर्गों पर कभी नहीं। – Miguel

+0

आप मनमाने ढंग से कक्षाओं में इंजेक्ट नहीं कर सकते हैं जिन्हें स्वयं डीआई द्वारा नहीं बनाया गया है या गुइस संदर्भ में पेश नहीं किया गया है। यदि आपकी कक्षा जिपर गुइस द्वारा बनाई गई थी या कहीं इंजेक्शन दी गई थी, तो आपके पास इंजेक्ट करने का संदर्भ होगा। http://stackoverflow.com/a/32896354/1956540 – BatteryAcid

उत्तर

3

मैं यहाँ आदेश में एक ही मुद्दा

मेरे त्रुटि रास्ता मैं अपने बुला वर्ग से मेरी जिपर जावा वर्ग का दृष्टांत के लिए इस्तेमाल किया से आया है के साथ किसी को भी मदद करने के लिए इस सवाल का जवाब में कहें,।

Igmar Palsenberg लिए Thx, उसने मुझे उत्तर प्रदान किया: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!topic/play-framework/uLFqTM9_Iy4

मैं = नए जिपर() का इस्तेमाल किया जिपर zipTest; मेरे जिपर वर्ग को स्थापित करने के लिए और मुझे ज़िप्पर zipTest = injector.instanceOf (जिपर का उपयोग करना होगा।कक्षा);

+0

नीचे दिए गए विवरण डालें क्या आपका क्लास कॉलर एक परीक्षण है? – marcospereira

+0

एनओपी, बस एक सहायक परत और जिपर वर्ग एक उपयोग वर्ग था, मेरी समझ यह है कि जब मैं जिपर ज़िपटेस्ट = नया जिपर() का उपयोग करता हूं, तो मैं निर्भरता इंजेक्शन मेकनिज्म को खो देता हूं। इसे रखने के लिए मुझे injector.instance का उपयोग करना होगा – Miguel

+0

के बजाय, तो आप उस वर्ग में 'जिपर' इंजेक्शन क्यों नहीं दे रहे हैं? – marcospereira

2

के साथ लाइन में एक नल पॉइंटर एक्सेप्शन मिलता है, बजाय निर्माता इंजेक्शन के साथ प्रयास करें:

import javax.inject.Inject; 
import play.Configuration; 
import play.Logger; 

public class Zipper { 

    private Configuration configuration; 

    @Inject 
    public Zipper(Configuration config) { 
     this.configuration = config; 
    } 

    public void unZip(String zipFilePath) { 
     Logger.debug("Display : zipFilePath"+zipFilePath); 
     Logger.debug("before call parameter from application.conf"); 
     Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path")); 
     Logger.debug("aftercall parameter from application.conf"); 
    } 
} 

मुझे यकीन नहीं है कि गुइस private फ़ील्ड इंजेक्ट करने में सक्षम है। वैसे भी, कन्स्ट्रक्टर इंजेक्शन अनुशंसित इंजेक्शन प्रकार है।

+0

से नीचे कुछ विवरण दिए हैं, मैंने इस तरह से देखा है, लेकिन यह मेरी ज़रूरत के अनुरूप नहीं लगता है। – Miguel

+0

मैंने इस तरह से देखा है, लेकिन यह मेरी ज़रूरत के अनुरूप नहीं लगता है। क्योंकि अगर मैं अपने कन्स्ट्रक्टर को अपडेट करता हूं, तो इसका मतलब है कि मेरे कॉलिंग जावा क्लास पर, मुझे यह नया पैरामीटर शुरू करना होगा, नहीं? जिपर ज़िपटेस्ट = नई जिपर (conf) और conf जैसे सामानों को मेरे कॉलिंग जावा क्लास में शुरू करना होगा, मैं इस स्थिति से बचना चाहूंगा, और इस मामले में जिपर क्लास पर इंजेक्शन उपयोगी नहीं है, नहीं? हो सकता है कि मैं गलत हूं, क्या आप मुझे दिखा सकते हैं कि जिपर क्लास को आपके प्रस्ताव के साथ कैसे कॉल करें? – Miguel

+0

इसके अलावा, जैसा कि मैंने कहा है कि निजी क्षेत्र इंजेक्ट करते हैं नियंत्रक application.java के साथ काम कर रहा है, मेरे पास यह समस्या केवल अन्य सभी जावा कक्षाओं पर है – Miguel

0

सिंगलटन के साथ अपनी कक्षा को एनोटेट करने का प्रयास करें ताकि वह खेल आपके संसाधनों को इंजेक्ट करने के लिए आपके बीन का पता लगा सके।

6

मुझे लगता है कि आप विन्यास इस तरह प्रारंभ कर सकते हैं:

private Configuration configuration = Play.current().injector().instanceOf(Configuration .class); 

तो, अपने जिपर हो जाएगा:

import javax.inject.Inject; 
import play.Configuration; 
import play.Logger; 

public class Zipper { 

    private Configuration configuration = Play.current().injector().instanceOf(Configuration .class); 

    public void unZip(String zipFilePath) { 
     Logger.debug("Display : zipFilePath"+zipFilePath); 
     Logger.debug("before call parameter from application.conf"); 
     Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path")); 
     Logger.debug("aftercall parameter from application.conf"); 
    } 
} 
1

आप private दूर करने के लिए प्रयास करना चाहिए। उपयोग:

@Inject Configuration configuration; 
बजाय

:

@Inject private Configuration configuration; 
संबंधित मुद्दे