2016-01-06 12 views
5

में ईजेबी बीन है, तो मैं शून्य की वापसी करता हूं। मैं अपनी गुणों को पढ़ने के लिए निर्माता विधि से बीन प्राप्त करना चाहता हूं। कुछ परिदृश्यों में बीन EJB Singleton बीन है।इंजेक्शनपॉइंट.जेटबीन() जावा ईई 7 (सीडीआई 1.1)

मैंने समस्या पर ध्यान केंद्रित करने के लिए अपना कोड सरल बना दिया है।

मेरे सरल क्वालीफायर:

@Qualifier 
@Retention(RUNTIME) 
@Target({TYPE, METHOD, FIELD, PARAMETER}) 
public @interface InjectMe {} 

सरल निर्माता:

@Dependent 
public class SimpleProducer { 

    @Produces 
    @InjectMe 
    public String getInjectMe(InjectionPoint ip) { 
     // ip.getBean() returns null for some reason 
     return "ip=" + ip + ", bean=" + ip.getBean(); 
    } 
} 

EJB (सिंगलटन):

@Singleton 
@Startup 
public class SimpleSingleton { 

    @Inject 
    @InjectMe 
    private String injectMe; 

    @PostConstruct 
    public void init() { 
     System.out.println(injectMe); 
    } 

}

कंसोल आउटपुट:

जानकारी: आईपी = [BackedAnnotatedField] @Inject @InjectMe निजी com.test.ejb.SimpleSingleton.injectMe, bean=null

जब मैं बदल Singleton सेम CDI सेम करने के लिए सब कुछ ठीक (ip.getBean() रिटर्न रिक्त नहीं काम करता है)। यह Java EE 6 में Singleton बीन के साथ भी काम करता है लेकिन यह Java EE 7 में नहीं है। मैं ग्लासफ़िश 4 एप्लिकेशन सर्वर का उपयोग कर रहा हूं।

क्या यह व्यवहार कहीं निर्दिष्ट है?

+0

एक ग्लासफ़िश बग की तरह लगता है। –

+0

@ जोहानएमेंट: ऐसा मत सोचो, वाइल्डफली के लिए एक ही व्यवहार। अभी तक प्रश्न का उत्तर नहीं दे सकता है, लेकिन संभावित कारण हो सकते हैं: 1) बीन खोज मॉड्यूल व्यवहार में परिवर्तन (डिफ़ॉल्ट: 'एनोटेटेड'); 2) एक (गैर-प्रासंगिक) वर्ग स्ट्रिंग इंजेक्शन; 3) 'आश्रित' –

+0

के अलावा कोई घोषित दायरा नहीं है यदि आप 'ip.getMember()। GetDeclaringClass() 'कहते हैं, तो आप दोनों मामलों के लिए FQCN प्राप्त करेंगे, यह इंजेक्शनपॉइंट API दस्तावेज़ में एक उदाहरण के रूप में भी उपयोग किया जाता है और मैंने इसे 'बीन'' शून्य के बाद एक फॉलोअप कॉल के रूप में एक डेल्टास्पिक उदाहरण में देखा है। –

उत्तर

1

WildFly 10.1.0 में मेरे लिए

injectionPoint.getMember().getDeclaringClass() 

काम करता है का उपयोग करते हुए और मैं भी जल्दी से यह Payara सर्वर 4.1.1.162 #badassfish में परीक्षण (116 निर्माण)। मैंने ब्रांड नए पेरा सर्वर 4.1.1.164 # बादास्फ़िश (28 बिल्ड) पर भी एक परीक्षण किया। हालांकि, मुझे निर्माता बीन का दायरा बदलकर @ एप्प्लिकेशंसस्कोड करना पड़ा। डिफ़ॉल्ट दायरा काम नहीं किया। मेरे मामले में, यह भी बनाता है भावना :)

injectionPoint.getBean().getBeanClass() 

विधि वर्ष Payara में मेरे लिए काम किया, लेकिन नहीं नई WildFly 10.1.0.Final में और नए Payara सर्वर 4.1.1.164 # Badassfish (28 निर्माण)।

यदि आपके पास पेरा पर एक नज़र है, तो वर्तमान नए संस्करण 164 में वेल्ड 2.4.0 शामिल है। फाइनल और वाइल्डफाली 10.1.0 फ़ाइनल संस्करण 2.3.5 का उपयोग करता है। अंतिम। दोनों संस्करणों में, शास्त्रीय कोड काम नहीं करता है!

निष्कर्ष पुराने सीडीआई कार्यान्वयन (वेल्ड) पर है, यह काम करता है। कुछ नए वेल्ड (पेरा 161 में पेश) में, व्यवहार बदल गया। मुझे नहीं पता कि यह जानबूझकर है या नहीं।

हालांकि, समाधान

injectionPoint.getMember().getDeclaringClass() 

का उपयोग करें और साथ

@javax.enterprise.context.ApplicationScoped 

एनोटेशन निर्माता सेम टिप्पणी करने के लिए है।

+1

वेबलॉगिक 12.2.1 (सीडीआई 1.1) पर परीक्षण किया गया और मुझे भी वही समस्या है। हालांकि यह वेबलॉगिक 12.1.3 (सीडीआई 1.0) पर ठीक काम कर रहा था। जैसा कि आपने कहा था, मैंने 'injectionPoint.getMember() का उपयोग कर समस्या हल की है। GetDeclaringClass()' – Rouliboy

+0

ऐसा लगता है कि यह पहले से ही पहचाना गया है: https://issues.jboss.org/browse/WELD-2339 –

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