मैं जर्सी में 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>
1 उत्तर
इसलिए मुझे कुछ चीजें गलत दिख रही हैं।
इंजेक्शन प्रकार को "अनुबंध" प्रकार होना चाहिए, जैसा कि
bind(Impl).to(Contract)
में है।to(Contract)
निर्दिष्ट करता है कि इंजेक्शन लगाने के लिए "विज्ञापित" प्रकार क्या होना चाहिए।इसलिए
PropertiesHandlerImpl
इंजेक्ट करने की कोशिश करने के बजाय, आप अनुबंधPropertiesHandler
के साथ इंजेक्शन लगाएंगे।@Inject PropertiesHandler handler;
मैं नहीं देखता कि आप
JDBCConnectionStrategy
का उपयोग कैसे कर रहे हैं। इसे आपकेAbstractBinder
में कॉन्फ़िगर नहीं किया गया है, इसलिए मैं अनुमान लगा रहा हूं कि आप इसे स्वयं इंस्टेंट कर रहे हैं। यह काम नहीं करेगा। आपको इसे DI सिस्टम से भी जोड़ना होगा और इसे इंजेक्ट करना होगा।फील्ड इंजेक्शन निर्माण के बाद होता है। इसलिए आप कंस्ट्रक्टर के अंदर सेवा का उपयोग तब तक नहीं कर सकते जब तक कि आप इसे कंस्ट्रक्टर में इंजेक्ट नहीं करते।
@Inject public JDBCConnectionStrategy(PropertiesHandler handler) { }
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।