2013-08-22 2 views
1

Мне нужно сохранить некоторые данные в сеансе пользователя. Обычно я использовал бы getSessionMap().put(), чтобы решить эту проблему. Моя проблема заключается в том, что мне нужно сделать это в sessionCreated(), как и мой sessionListener, но в данный момент FacesContext по-прежнему является нулевым. Таким образом, приведенный ниже код генерирует исключение NullPointerException.Сохранение данных путем создания сеанса в сеансе

@Override 
    public void sessionCreated(HttpSessionEvent arg0) { 
     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("data", "something"); 
    } 

Есть ли другой способ хранения данных в сеансе или я могу инициализировать экземпляр FacesContext вручную? К сожалению, я мало знаю о жизненном цикле jsf.

Спасибо за помощь!

ответ

1

Вы, кажется, полностью упустили тот факт, что JSF является лишь один большой абстрактный слой над «простой» Servlet API и ExternalContext (пожалуйста, все время внимательно прочитать его javadoc, в том числе method descriptions): всего делегатов классов/методов доступный в «обычном» API сервлетов.

В вашем конкретном случае, когда вы используете JSF поверх Servlet API (вместо портлета API), то ExternalContext#getSessionMap() это всего лишь фасад HttpSession#setAttribute()/#getAttribute(). И угадайте, что, HttpSession находится в вашем HttpSessionListener, легко доступном по аргументу HttpSessionEvent!

@Override 
public void sessionCreated(HttpSessionEvent event) { 
    event.getSession().setAttribute("data", "something"); 
} 

Это то доступны по getSessionMap().get("data"), или @ManagedProperty("#{data}") в любой JSF бэк-боба, или просто #{data} в EL на странице JSF.

Смежные вопросы