Ответ 1
NullPointerException
имеет чрезвычайно простую причину. Это одно из самых простых исключений. Чтобы узнать о причине произвольного исключения, просто посмотрите его javadoc. Все исключения Java имеют свои причины, объясненные в javadoc. Здесь выдержка javadoc NullPointerException
:
Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
- Вызов метода экземпляра объекта
null
.- Доступ или изменение поля объекта
null
.- Взятие длины
null
, как будто это массив.- Доступ или изменение слотов
null
, как если бы это был массив.- Бросок
null
, как если бы это было значение Throwable.Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные действия нулевого объекта.
Ваша проблема вызвана точкой 1. Здесь
HttpServletRequest request;
HttpSession session = request.getSession();
вы пытаетесь вызвать метод getSession()
на null
вместо конкретного экземпляра HttpServletRequest
. Фактически, вы должны были получить HttpServletRequest
через ExternalContext#getRequest()
и назначить его request
.
Однако у вас большие проблемы: вы абсолютно не должны улавливать текущий запрос сервлета в качестве свойства сеанса bean (который живет дольше, чем HTTP-запрос!). Вы должны получить его внутри локальной области потока (т.е. Полностью внутри конструктора или блока метода). Вы также не должны позволять вашему JSF bean реализовать HttpSessionListener
. Это не имеет никакого смысла. У вас будет 2 экземпляра, один из которых будет создан в качестве слушателя контейнером, а другой - как управляемый bean JSF.
Просто так:
@ManagedBean(name="login")
@SessionScoped
public class MyLoginBean implements Serializable {
public MyLoginBean() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession();
session.setMaxInactiveInterval(1200);
}
// ...
}
Или, если вы используете JSF 2.1, используйте тот, который предоставляется ExternalContext
:
FacesContext.getCurrentInstance().getExternalContext().setSessionMaxInactiveInterval(1200);