Доступ к управляемому свойству в фильтре

В моих попытках выяснить причину проблем, указанных в этом вопросе: медленная загрузка страницы JSF2 , я хотел бы задать время фильтра сеанса пользователя, который я использую. Я создал таймер, который представляет собой bean-компонент ApplicationScoped.

Мой вопрос заключается в том, можно ли получить доступ к этому компоненту как к управляемому свойству из фильтра. В других моих компонентах я могу сделать это, хотя в фильтре управляемое свойство всегда равно нулю.


person nivis    schedule 28.11.2012    source источник
comment
Когда вы сказали фильтр, вы на самом деле имеете в виду javax.servlet.Filter? (если это так, вы должны были использовать тег [servlet-filters], а не [filter]!) Принятый в настоящее время ответ в этом случае не имеет смысла.   -  person BalusC    schedule 28.11.2012
comment
Ты прав. Я изменил тег на правильный. Что касается ответа, последнее предложение сработало. Я все еще не уверен, как работает механизм ManagedProperty в этом контексте.   -  person nivis    schedule 28.11.2012
comment
FacesContext обычно вообще недоступен в фильтре сервлета, поэтому почему он работает для вас, мне не понятно. Управляемое свойство работает только в управляемом компоненте, однако фильтр сервлета не является управляемым компонентом. Затем на ваш вопрос в основном отвечает тот же ответ, что и на этот вопрос: stackoverflow.com/questions/2633112/   -  person BalusC    schedule 28.11.2012
comment
Спасибо за просвещение меня и примеры в ссылке.   -  person nivis    schedule 28.11.2012


Ответы (1)


Обновленный ответ:

Получите доступ к компоненту области приложения из фильтра следующим образом.

ServletContext context = req.getServletContext();
MyAppBean myAppBean = (MyAppBean) context.getAttribute("myAppBean");

Получите доступ к компоненту с областью действия сеанса из фильтра следующим образом.

HttpSession session = ((HttpServletRequest) req).getSession(false);
MyAppBean myAppBean = (MyAppBean ) session.getAttribute("myAppBean");

Исходный ответ:

Да, можете, сделайте (eager = true) и добавьте необходимые аннотации.

@ManagedBean(eager = true)
@ApplicationScoped
public class MyAppBean { }

и в вашем доступе к компоненту с областью действия сеанса это выглядит так

@ManagedProperty(value = "#{myAppBean }")
private MyAppBean myAppBean; //add getter and setter

Если ваш bean-компонент не является @ManagedBean, вы можете получить к нему доступ из ApplicationMap следующим образом

MyAppBean myAppBean = (MyAppBean ) FacesContext.getCurrentInstance().
    getExternalContext().getApplicationMap().get("country");

Если bean-компонент, к которому вы хотите получить доступ, является @SessionScoped, вы можете получить его из SessionMap, как это

MyAppBean myAppBean = (MyAppBean ) FacesContext.getCurrentInstance().
    getExternalContext().getSessionMap().get("country");

Здесь у вас есть хороший учебник о том, как получить доступ к bean-компонентам из неуправляемых bean-компонентов.

Доступ к управляемому компоненту из прослушивателя событий — JSF< /а>

person Daniel    schedule 28.11.2012
comment
Боюсь, это не имело значения. Должен ли фильтр быть бобом, чтобы это работало? В настоящее время это не так. - person nivis; 28.11.2012
comment
Это сработало, используя ваше последнее решение. Однако регистрация фильтра как ManagedBean этого не сделала. Странный. Спасибо за вашу помощь! - person nivis; 28.11.2012