Как я могу получить объект на @WindowScoped?

В этом сообщении Динамический ui: include Я спросил, как я могу хранить объект в каком-либо состоянии, которое могло бы позволить мне загружать новые окна или вкладку тот же браузер, и он не был также сохранен в новых окнах. Адриан Митев сказал мне использовать @WindowScoped, вариант расширения MyFaces под названием CODI, и я попытался его реализовать.

Теперь я должен сказать, что я слепой, и когда я пытался открыть Apache Wiki, мой браузер разбился на многих страницах, поэтому я не могу читать руководства.

Однако я добавляю исходный код в свой проект, и компилятор не дал никаких ошибок. Проблема в том, что теперь страница, когда я пытаюсь восстановить bean, который я сохранил с помощью @WindowScoped, не работает должным образом!

Я использую этот код в своем bean:

@ManagedBean (name="logicBean" )
@WindowScoped

В include.xhtml я извлекаю параметр с помощью этого кода:

<ui:include src="#{logicBean.pageIncluded}"/> 

И в моем другом beans я извлекаю LogicBean с этим кодом (и я уверен, что проблема в этом коде)

LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");

Как я могу восстановить "правильный" объект LogicBean?

Ответ 1

Вы пытаетесь получить LoginBean с карты сеанса. Это работает только для сеансового beans со стандартной аннотацией JSF @SessionScoped.

Канонический способ доступа к другим beans использует @ManagedProperty для извлечения bean.

например.

@ManagedBean
@RequestScoped
public class OtherBean {

    @ManagedProperty("#{logicBean}")
    private LogicBean logicBean;

    // Getter+Setter.
}

Если вам действительно нужно получить доступ к нему внутри блока метода, используя программный код EL, вы должны использовать Application#evaluateExpressionGet():

FacesContext context = FacesContext.getCurrentInstance();
LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class);
// ...