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

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

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

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

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

@ManagedBean (name="logicBean" )
@WindowScoped

В include.xhtml Я получаю параметр с этим кодом:

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

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

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

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

1 ответ

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

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

Например

@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);
// ...
Другие вопросы по тегам