2010-01-07 11 views
12

के साथ एक जेएसएफ कनवर्टर में एक ईजेबी इंजेक्ट करें मेरे पास एक स्टेटलेस ईजेबी है जो मेरे डेटाबेस को acceses। मुझे स्ट्रिंग मान पैरामीटर से किसी इकाई ऑब्जेक्ट को पुनः प्राप्त करने के लिए जेएसएफ 2 कनवर्टर में इस बीन की आवश्यकता है। मैं ग्लासफ़िश वी 3 के साथ जेईई 6 का उपयोग कर रहा हूं।जेईई 6

@EJB एनोटेशन काम नहीं करता है और एनपीई प्राप्त करता है, क्योंकि यह चेहरे के संदर्भ में है और इसकी ईजेबी संदर्भ तक पहुंच नहीं है।

मेरा प्रश्न है: यह अभी भी एक @Resource या अन्य टिप्पणी या एक JNDI देखने के साथ इस सेम सुई संभव है, या मैं एक समाधान की जरूरत है?


समाधान

इस तरह एक JNDI देखने कार्य करें:

try { 
    ic = new InitialContext(); 
    myejb= (MyEJB) ic 
    .lookup("java:global/xxxx/MyEJB"); 
    } catch (NamingException e) { 
    e.printStackTrace(); 
    } 

उत्तर

6

मैं JSF 2.0 (केवल 1.0) इस्तेमाल कभी नहीं किया है, लेकिन कल्पना के अध्याय 5.4 का कहना है:

[...] कंटेनर को संदर्भों को इंजेक्ट करने की अनुमति दें कंटेनर प्रबंधित संसाधन जेएसएफ आवेदन के लिए सुलभ होने से पहले एक प्रबंधित बीन उदाहरण में। केवल बीन्स अनुरोध में घोषित होने की घोषणा की गई, सत्र, या एप्लिकेशन स्कोप संसाधन इंजेक्शन के लिए eligble हैं।

लेकिन अब तक मैं समझता हूं, एक जेएनडीआई लुकअप को चाल चलनी चाहिए।

+0

JNDI देखने से काम नहीं करता: लेकिन यह काम करता है। मैंने @EJB (मैप किए गए नाम = "जावा: ग्लोबल/मायप्रोजेक्ट/मायईजेबी") की कोशिश की जहां मूल्य –

+2

पर तैनाती करते समय मेरे ईजेबी के "पोर्टेबल जेएनडीआई नाम" के रूप में कंसोल में ग्लासफ़िश आउटपुट करता है, @EJB एनोटेशन का उपयोग न करें। InitialContext का उपयोग कर लक्ष्य घटक प्राप्त करें। – Bozho

+0

@ बोझो: InitialContext काम किया! :) धन्यवाद –

2

अन्य (अभी तक इतना सुंदर नहीं) समाधान कनवर्टर आईडी के बजाय बाध्यकारी का उपयोग कर सकता है। का उपयोग करते हुए JSF कामयाब सेम केवल:

< च: कनवर्टर बाध्यकारी = "# {app.personConverter}"/>

कहाँ appBean की तरह कुछ के लिए खड़ा है: @ManagedBean(name="app") @ApplicationScoped class AppBean { @EJB private PersonService ps; private Converter personConverter; }

वहाँ CDI में एक अच्छे समाधान हो सकता है बाध्यकारी = "# {cdiBean}"/>

कनवर्टर:

< च: शैली (JSR-299), लेकिन मैं यह एक चल रहा है बनाने के लिए में विफल रहा है गया है

cidBean कहाँ होना चाहिए: @Named class CdiBean implements Converter { @EJB ... }

किसी भी तरह पहले दृष्टिकोण का उपयोग बाध्यकारी और एप्लिकेशन JSF सेम काम करता है scoped 'डिफ़ॉल्ट एक कनवर्टर-आईडी निर्माता में पारित की आवश्यकता के लागू व्यवहार' के साथ विफल।

2

मुझे पता नहीं है, तो इस समाधान बहुत है ...

@ManagedBean 
public class AcquisitionConverter implements Converter 
{ 
    @EJB 
    private AcquisitionService service; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
    { 
     ... 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) 
    { 
     ... 
    } 
} 

और

<h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}"> 

JSF 2.1.3 (mojarra) और glassfish साथ 3.1.1

+0

'@ फेस कनवर्टर' एनोटेशन इस निर्माण में अतिप्रवाह है (और केवल शुरुआत करने वालों के लिए भ्रमित) है। इसे हटा दो। – BalusC

+0

ठीक है, मैंने इसे हटा दिया :) –

+0

कनवर्टर = "# {अधिग्रहण कनवर्टर}" वह चीजें थीं जो मेरे लिए काम नहीं करतीं –