FacesContext
экземпляры уникальны для каждого потока, и FacesServlet
создает ThreadLocal<FacesContext>
в начале запроса при получении FacesContext
(который является контрактом FacesContextFactory#getFacesContext)
и удаляет его в концеответ, связанный с запросом сервлета HTTP (путем вызова FacesContext#release
).
Всякий раз, когда вы делаете FacesContext#getCurrentInstance()
в своем коде JSF, вы всегда будете получать один и тот же экземпляр во всем запросе сервлета HTTP /обработка ответов.
О методе UIViewRoot#processDecodes
я действительно не вижу ни одной строки, которая, вероятно, могла бы указывать, что метод использует собственный созданный экземпляр, а не переданный.Какая линия заставила вас так думать?
В методе FacesServlet#service
видно, что он создает FacesContext
из FacesContextFactory
, вот выдержка из метода FacesServlet#service
, которая показывает это -
// Acquire the FacesContext instance for this request
FacesContext context = facesContextFactory.getFacesContext
(servletConfig.getServletContext(), request, response, lifecycle);
// Execute the request processing lifecycle for this request
try {
...
} catch (FacesException e) {
...
}
finally {
// Release the FacesContext instance for this request
context.release();
}
Учитывая это, я не думаю, что UIViewRoot#processDecodes
может иметь экземпляр FacesContext
, который не относится к FacesContextFactory
.
Поскольку вы говорите - вы установили некоторые дополнительные параметры для FacesContext
, которые возвращаются из FacesContextFactory
, это означает, что у вас есть собственная пользовательская реализация FacesContextFactory
, если это так, тоВы уверены, что ваш экземпляр вводится в FacesServlet
, а не в моджарре com.sun.faces.context.FacesContextFactoryImpl
(если вы используете моджарру)?