2012-11-08 21 views
12

हम गुइस के साथ एक परियोजना को दोबारा करने की कोशिश करते हैं। विचार भाषा इंटरफ़ेस को फ़्रेंच या पोलिश जैसे एक ठोस वस्तु के लिए बाध्य करना है।गिइस इंजेक्शन नल पॉइंटर

हम बंधन के लिए एक मॉड्यूल है:

public class StandardModule extends AbstractModule { 

    @Override 
    protected void configure() { 

     bind(Language.class).to(Polish.class); 

    } 
} 

और एक classe (AboutDialog.java) है कि इस इंजेक्शन वस्तु का उपयोग करें:

@Inject Language language; 

public AboutDialog(JFrame parent) { 
    super(parent, "", true); 
    this.language=language; 
    this.setTitle(language.getLanguageInUse().getString("AboutDialog.title")); 
    this.parent = parent; 
    try { 
     jbInit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    pack(); 
} 

और हम परिणाम के रूप में है:

java.lang.NullPointerException at net.sf.jmoney.gui.AboutDialog.<init>(AboutDialog.java:67) 

लाइन 67 है:

this.setTitle(language.getLanguageInUse().getString("AboutDialog.title")); 

हमारे इंटरफ़ेस है:

public interface Language { 

    public ResourceBundle getLanguageInUse(); 
} 

और पोलिश वर्ग है:

public class Polish implements Language { 

    private ResourceBundle languageInUse; 

    public Polish() { 
     languageInUse = ResourceBundle.getBundle(Constants.LANGUAGE_PL); 
    } 

    public ResourceBundle getLanguageInUse() { 
     return languageInUse; 
    } 


} 

हम खो रहे हैं ...

+0

आप अपने कोड जहां एनपीई फेंक दिया जाता है एक छोटा सा, देखने के लिए बदलना चाहिए 'कोड ResourceBundle बंडल = language.getLanguageInUse();।। स्ट्रिंग लेबल = bundle.getString (" AboutDialog.title "); ' –

+0

शून्य वस्तु भाषा है। हम सोचते हैं कि इंजेक्शन काम नहीं करता है। – user1810567

+0

आप aboutDialog कैसे बनाते हैं? मुझे नहीं लगता कि आप गुइस के साथ संवाद बना रहे हैं, क्योंकि गुइस को एक खाली कन्स्ट्रक्टर की आवश्यकता है या आप कहीं कहीं jframe बांधते हैं? –

उत्तर

8

मुझे लगता है कि आपकी मदद के साथ अपने AboutDialog रचना नहीं करते हैं गुइस का

आप क्या कर सकते हैं injector.injectMembers(this) का उपयोग करें जहां thisAboutDialog है।

सबसे अच्छा तरीका यह होगा कि AboutDialog गुइस द्वारा बनाया जाएगा, इसलिए सभी सदस्यों को इंजेक्शन दिया जाएगा।

7

आप "फील्ड इंजेक्शन" का उपयोग कर रहे हैं। इससे कन्स्ट्रक्टर में आपके इंजेक्शन वाले मानों का उपयोग करना मुश्किल हो जाएगा; यहां तक ​​कि अगर गुइस ऑब्जेक्ट (जो अब नहीं हो रहा है) बनाने के लिए थे या आप injector.injectMembers(aboutDialog) का उपयोग करना चाहते थे, तो इंजेक्टर के पास इंजेक्टर को आपके इच्छित क्षेत्र को इंजेक्ट करने का मौका मिलने से पहले चलाया जाएगा।

यह एक वर्ग बनाने के लिए थोड़ा और मुश्किल है जो एक भिन्न पैरामीटर के साथ-साथ इंजेक्शन पैरामीटर भी लेता है। यह आपको कुछ विकल्पों के साथ छोड़ देता है:

  • जेएफआरएएम इंजेक्ट करें। यदि आप जानते हैं कि कन्स्ट्रक्टर बनने पर आप जेएफआरएएम का उपयोग करने जा रहे हैं, तो बस अपने मॉड्यूल में bind(JFrame.class).toInstance(myJFrame); का उपयोग करें। फिर Guice पूरी तरह से aboutDialog बना सकते हैं।

  • मैन्युअल रूप से फैक्टरी बनाएं। इस तरह आप AboutDialog.Factory इंजेक्ट कर सकते हैं और अपने AboutDialog प्राप्त करने के लिए बस create पर कॉल करें। यह कुछ इस तरह दिखाई देंगे:

    public class AboutDialog extends JDialog { 
    
        /** Injectable factory. */ 
        public static class Factory { 
        @Inject private Language language; 
    
        public AboutDialog create(JFrame parent) { 
         return new AboutDialog(parent, language); 
        } 
        } 
    
        // no @Inject parameter; you're calling "new" yourself above! 
        public AboutDialog(JFrame parent, Language language) { 
        super(parent, "", true); 
        this.language = language; 
        // ... other initialization 
        } 
    } 
    
  • एक फैक्टरी बनाने और Guice यह तार ऊपर आप के लिए जाने assisted injection के माध्यम से।

    public class AboutDialog extends JDialog { 
    
        public interface Factory { 
        public AboutDialog create(JFrame parent); 
        } 
    
        // you need the @Inject, and also the @Assisted to tell Guice to 
        // use the parameter instead of Guice bindings 
        @Inject 
        public AboutDialog(@Assisted JFrame parent, Language language) { 
        super(parent, "", true); 
        this.language = language; 
        // ... other initialization 
        } 
    } 
    
    public class StandardModule extends AbstractModule { 
        @Override protected void configure() { 
        bind(Language.class).to(Polish.class); 
    
        // here every method in AboutDialog.Factory will be implemented 
        // to create the method's return type [AboutDialog] based on 
        // the parameters (like JFrame) and the bindings (like Language) 
        install(new FactoryModuleBuilder().build(AboutDialog.Factory.class)); 
        } 
    } 
    

प्रश्न टिप्पणी में बताया गया है, सुनिश्चित करें कि आप प्राप्त कर रहे हैं अपने AboutDialog (या एक @Inject एड निर्माता/क्षेत्र के माध्यम से या Injector ही, वरना से AboutDialog.Factory Guice सुई पता नहीं चलेगा मापदंडों

+0

हम ऑब्जेक्ट इंजेक्ट करने में सफल रहे हैं और परियोजना पूरी तरह से काम करता है। आपकी मदद के लिए धन्यवाद ^^। – user1810567

+0

आपका स्वागत है! यदि आपको समस्या हल हो जाती है तो कृपया याद रखें [एक उत्तर स्वीकार करें] (http://stackoverflow.com/faq#howtoask)। आपकी परियोजना के लिए शुभकामनाएं! –

+1

यह वाक्य "इंजेक्टर के पास इंजेक्टर को आपके इच्छित क्षेत्र को इंजेक्ट करने का मौका मिलने से पहले चलाया जाएगा" क्योंकि मुझे समझ में नहीं आया कि मेरे इंजेक्शन वाले फ़ील्ड का इस्तेमाल मेरे डिफ़ॉल्ट कंस्ट्रक्टर के अंदर क्यों किया जा रहा था। धन्यवाद!!! – mljrg

संबंधित मुद्दे