Исключение нулевого указателя в JSFUtils.resolveExpression("#{sessioncontext}") в сервлете
Я работаю с сервлетами и пытаюсь получить контекст сеанса, используя метод JSFUtils.resolveExpression("#{sessioncontext}") в ADF, но он дает мне исключение нулевого указателя. Что не так с использованным выше методом и есть ли другой способ получения сессионного контекста в моем сервлете?
Спасибо,
Изменить: пожалуйста, найдите код ниже,
public class MyServlet extends HttpServlet {
public final void init(final ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
SessionContext session = (SessionContext) JSFUtils.resolveExpression("#{sessioncontext}");
//more code below
}
}
2 ответа
Я заменил вышеприведенную строку кода на код ниже, и он отлично работает:) У меня не было доступа к FacesContext, который выбрасывал нулевой указатель
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
FacesContextFactory contextFactory =
(FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory =
(LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle =
lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext =
contextFactory.getFacesContext(request.getSession().getServletContext(),
request, response,
lifecycle);
// Below is an Inner Class which extends FacesContext to use its below protected method
AbstractInnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
}
Теперь, так как у меня есть FacesContext, я могу легко извлечь из него SessionContext, используя ту же логику, что и метод resolExpression:) (Yay!!!)
Ваш сервлет не может получить доступ к FacesContext, если вы не используете URL-адрес сопоставления сервлета Faces.
Например, в любом приложении oracle ADF по умолчанию сопоставление URL-адреса JSF-сервлета по умолчанию - /face /*. Поэтому, если вы установите для своего сервлета такое же отображение, контекст Faces не будет иметь значение null.
например, сделайте так, чтобы ваш URL-адрес сервлета был похож на следующий /face /myCoolServlet, и он будет работать нормально.