मैं जर्सी में hk2 DI का उपयोग करने की कोशिश कर रहा हूं और मैंने इस मामले पर कुछ ग्रंथ पढ़े हैं। (मुझे लगता है कि ज्यादातर पुराने हैं) वर्तमान में मेरे पास एक वर्ग है जो रिसोर्सकॉन्फिग का विस्तार करता है:

public class MyApplication extends ResourceConfig{
    public MyApplication(){
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(AuthenticationServiceImpl.class).to(AuthenticationService.class);
                bind(PropertiesHandlerImpl.class).to(PropertiesHandler.class).in(Singleton.class);
            }
        });
        packages(true, "com.myclass");        }
}

और दूसरी कक्षा में मैं इन बाध्य वर्गों में से एक को इंजेक्ट करने का प्रयास करता हूं:

public class JDBCConnectionStrategy implements DatabaseConnectionStrategy {
    private Connection connection;

    @Inject
    PropertiesHandlerImpl propertiesHandler;

    public JDBCConnectionStrategy() throws SQLException{
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            String host = propertiesHandler.getProperty("host");
            String userName = propertiesHandler.getProperty("userName");
            String password = propertiesHandler.getProperty("password");
            //Create a connection
            this.connection = DriverManager.getConnection(host, userName, password);
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
....
}

इस प्रकार घोषित:

@Singleton
@Service
public class PropertiesHandlerImpl implements PropertiesHandler {...}

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

WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2 java.lang.NullPointerException
    at com.myclass.JDBCConnectionStrategy.<init>

अपडेट करें:
मुझे यह जोड़ना चाहिए कि मैंने web.xml में स्कैन किए गए पथ में एप्लिकेशन पैकेज जोड़ा है:

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.myclass.system.CmisApplication</param-value>
    </init-param>
0
Dark Star1 10 जिंदा 2017, 20:06
मुझे एक बात गलत दिखाई दे रही है, लेकिन मैं इसे उत्तर के रूप में पोस्ट करने में संकोच कर रहा हूं, क्योंकि मुझे आपकी पोस्ट में कहीं भी समस्या का विवरण नहीं दिख रहा है। आप जिस समस्या का सामना कर रहे हैं वह बिल्कुल क्या है (जैसे त्रुटि/स्टैकट्रेस/अपवाद)?
 – 
Paul Samsotha
11 जिंदा 2017, 05:46
इंजेक्शन गुणों का उपयोग करते समय मुझे NullPointerException मिलता है उदाहरण के लिए हैंडलर:
 – 
Dark Star1
11 जिंदा 2017, 11:32
केवल तभी काम करता है जब आप hk2 को अपनी सेवाओं के बारे में बताने के लिए स्वचालित विधियों में से किसी एक का उपयोग कर रहे हों। स्वचालित विधियों का उपयोग करने के लिए आपको संभवतः hk2.java.net/2.5.0-b31/apidocs/org/glassfish/hk2/utilities/…। सामान्य रूप से स्वचालित सेवा जनसंख्या के बारे में जानकारी के लिए इस पृष्ठ को पढ़ें: hk2. java.net/2.5.0-b31/…
 – 
jwells131313
11 जिंदा 2017, 16:31

1 उत्तर

सबसे बढ़िया उत्तर

इसलिए मुझे कुछ चीजें गलत दिख रही हैं।

  1. इंजेक्शन प्रकार को "अनुबंध" प्रकार होना चाहिए, जैसा कि bind(Impl).to(Contract) में है। to(Contract) निर्दिष्ट करता है कि इंजेक्शन लगाने के लिए "विज्ञापित" प्रकार क्या होना चाहिए।

    इसलिए PropertiesHandlerImpl इंजेक्ट करने की कोशिश करने के बजाय, आप अनुबंध PropertiesHandler के साथ इंजेक्शन लगाएंगे।

    @Inject
    PropertiesHandler handler;
    
  2. मैं नहीं देखता कि आप JDBCConnectionStrategy का उपयोग कैसे कर रहे हैं। इसे आपके AbstractBinder में कॉन्फ़िगर नहीं किया गया है, इसलिए मैं अनुमान लगा रहा हूं कि आप इसे स्वयं इंस्टेंट कर रहे हैं। यह काम नहीं करेगा। आपको इसे DI सिस्टम से भी जोड़ना होगा और इसे इंजेक्ट करना होगा।

  3. फील्ड इंजेक्शन निर्माण के बाद होता है। इसलिए आप कंस्ट्रक्टर के अंदर सेवा का उपयोग तब तक नहीं कर सकते जब तक कि आप इसे कंस्ट्रक्टर में इंजेक्ट नहीं करते।

    @Inject
    public JDBCConnectionStrategy(PropertiesHandler handler) {
    
    }
    
1
Paul Samsotha 11 जिंदा 2017, 20:01