Не найдено FacesContext в JoinFaces ViewScope
В настоящее время мы переносим довольно большой проект с JavaEE (Wildfly) на Spring Boot 2.0.5, используя JoinFaces 3.2.5 для поддержки JSF. К сожалению, при запуске сервера мы всегда получаем следующее сообщение:
Область 'view' не активна для текущего потока; рассмотрите возможность определения прокси-объекта с областью видимости для этого компонента, если вы намереваетесь ссылаться на него из синглтона; Вложенное исключение -java.lang.IllegalStateException: не найден FacesContext.
Проблемным компонентом пользовательского интерфейса является Spring-компонент, дополнительно аннотированный javax.faces.view.ViewScoped (например, класс StarterMBean в примере joinfaces-maven-jar-пример).
Есть ли что-то особенное, к чему мы должны быть осторожны, например, запрещенные зависимости, специальные конфигурации и т. Д.?
Мы благодарны за каждый намек!
1 ответ
У вас есть синглтон / bean-объект bean-компонента, который имеет прямую или косвенную зависимость от bean-объекта видимости. Это вынуждает BeanFactory создавать bean-объект области видимости при запуске приложения, но bean-объекты вида могут использоваться только в потоках, которые в настоящий момент обрабатывают запрос JSF.
Есть несколько способов решить эту проблему:
- Попробуйте смоделировать ваши bean-компоненты, чтобы иметь зависимости только от bean-компонентов с той же или большей областью действия. (Таким образом, bean-объекты с областью приложения могут использовать только bean-объекты с областью приложения, bean-объекты с областью представления могут использовать view, сессию или сферу применения и т. Д.)
- Когда вы на 100% уверены, что ваш компонент с областью приложения будет использовать только вид с областью действия при обработке запроса JSF, вы можете автоматически или вручную обернуть компонент в прокси с областью действия.
- Чтобы получить прокси с областью действия автоматически, измените
@ViewScoped
в@Scope(scopeName = "view", proxyMode = ScopedProxyMode.TARGET_CLASS)
- Если у вас нет доступа к компоненту видимости, вы можете объявить точку внедрения как
ObjectProvider<>
для того, чтобы получить прокси области.
- Чтобы получить прокси с областью действия автоматически, измените
Дополнительную информацию об этой проблеме можно найти здесь: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html