Получить его в сеансе с управляемым bean-компонентом с @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)
в другом месте (или, возможно, событие CDI @Observes
), вы можете вводить его в любом месте, используя @Inject @Named
.
@Inject
@Named("attrname")
private MyObject myObject;
И да, он по-прежнему доступен через #{attrname}
в EL обычным способом. И нет, он не будет автоматически создан, если не установлен, он останется null
, пока вы не установите его как свойство класса-производителя.
В качестве альтернативы, если вы действительно намерены сохранить унаследованную способ настройки экземпляра с помощью ExternalContext#getSessionMap()
(например, потому, что третья сторона, и вы можете таким образом не изменить его), то вы можете в качестве альтернативы также позволяет производителю вернуть его непосредственно от сеанса карты:
@SessionScoped
public class MyObjectProducer implements Serializable {
@Produces
@Named("attrname")
public MyObject getMyObject() {
return (MyObject) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("attrname");
}
}
Это, однако, не гарантирует работу при введении в не JSF артефакта, такие как произвольное @WebServlet
, как FacesContext#getCurrentInstance()
, очевидно, вернется null
.
Спасибо @BalusC за быстрый и полный ответ. –
Возможно, ответ может быть еще более полным, говоря, что для доступа к производителю из не управляемого кода используется этот код 'CDI.current(). Select (MyObjectProducer.class) .get()'. –