Erhalten Sie es in einer Session-Bereich verwaltete Bean mit einem @Produces
@Named
auf dem Getter.
@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;
}
}
Wenn Sie es irgendwie über z. myObjectProducer.setMyObject(myObject)
woanders (oder vielleicht ein CDI @Observes
Ereignis), dann können Sie es überall mit @Inject @Named
injizieren.
@Inject
@Named("attrname")
private MyObject myObject;
Und ja, es ist immer noch über #{attrname}
in EL die übliche Art und Weise. Und nein, es wird nicht automatisch erstellt, wenn es nicht festgelegt wird, es bleibt null
, bis Sie es tatsächlich als eine Eigenschaft der Producer-Klasse festlegen.
Alternativ, wenn Sie wirklich das Erbe Art und Weise des Einstellens der Instanz über ExternalContext#getSessionMap()
halten wollen (zB weil es Dritten ist und Sie können somit nicht geändert werden), dann können Sie alternativ lassen auch der Produzent es direkt zurück aus der Sitzung Karte:
@SessionScoped
public class MyObjectProducer implements Serializable {
@Produces
@Named("attrname")
public MyObject getMyObject() {
return (MyObject) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("attrname");
}
}
Dies ist jedoch nicht offensichtlich ist garantiert, wenn in einem nicht-JSF Artefakt, wie eine willkürliche @WebServlet
, wie die FacesContext#getCurrentInstance()
würde null
zurückkehren injiziert zu arbeiten.
Danke @BalusC für Ihre schnelle und vollständige Antwort. –
Vielleicht könnte die Antwort noch vollständiger sein und sagen, dass für den Zugriff auf den Producer aus nicht verwaltetem Code dieser Code 'CDI.current(). Select (MyObjectProducer.class) .get()' verwendet werden kann. –