गेटटर पर @Produces
@Named
के साथ प्रबंधित सत्र बीन में इसे पकड़ लें।
@SessionScoped
public class MyObjectProducer implements Serializable {
private MyObject myObject;
@Produces
@Named("attrname")
public MyObject getMyObject() {
return myObject;
}
public void setMyObject(MyObject myObject) {
this.myObject = myObject;
}
}
जब आप इसे किसी भी तरह से सेट करते हैं उदा। myObjectProducer.setMyObject(myObject)
कहीं और (या शायद एक सीडीआई @Observes
घटना), तो आप इसे @Inject @Named
का उपयोग करके कहीं भी इंजेक्ट कर सकते हैं।
@Inject
@Named("attrname")
private MyObject myObject;
और हाँ, यह अभी भी ईएल में #{attrname}
के माध्यम से सामान्य रूप से उपलब्ध है। और नहीं, यह सेट नहीं होने पर ऑटो-निर्मित नहीं किया जाएगा, यह null
रहेगा जब तक कि आप इसे वास्तव में निर्माता वर्ग की संपत्ति के रूप में सेट न करें।
वैकल्पिक रूप से, यदि आप वास्तव में ExternalContext#getSessionMap()
के माध्यम से उदाहरण स्थापित करने की विरासत तरह से रखने के लिए करना चाहते हैं (उदाहरण के लिए, क्योंकि यह तीसरी पार्टी है और आप इस तरह यह नहीं बदल सकते हैं), तो आप वैकल्पिक रूप से भी निर्माता यह सीधे वापस करने दे सकते हैं सत्र के नक्शे से:
@SessionScoped
public class MyObjectProducer implements Serializable {
@Produces
@Named("attrname")
public MyObject getMyObject() {
return (MyObject) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("attrname");
}
}
हालांकि यह इस तरह के एक मनमाना @WebServlet
के रूप में जब एक गैर JSF विरूपण साक्ष्य, में इंजेक्शन काम करने के लिए गारंटी नहीं है, FacesContext#getCurrentInstance()
जाहिर null
वापसी होगी के रूप में।
अपने त्वरित और पूरा जवाब के लिए आप @BalusC धन्यवाद। –
शायद उत्तर और भी पूर्ण हो सकता है कि निर्माता को कोड कोड से प्रबंधित करने के लिए इस कोड को 'CDI.current() चुनें। (MyObjectProducer.class) .get()' का उपयोग किया जा सकता है। –