Не найдено 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.

Есть несколько способов решить эту проблему:

  1. Попробуйте смоделировать ваши bean-компоненты, чтобы иметь зависимости только от bean-компонентов с той же или большей областью действия. (Таким образом, bean-объекты с областью приложения могут использовать только bean-объекты с областью приложения, bean-объекты с областью представления могут использовать view, сессию или сферу применения и т. Д.)
  2. Когда вы на 100% уверены, что ваш компонент с областью приложения будет использовать только вид с областью действия при обработке запроса JSF, вы можете автоматически или вручную обернуть компонент в прокси с областью действия.
    • Чтобы получить прокси с областью действия автоматически, измените @ViewScoped в @Scope(scopeName = "view", proxyMode = ScopedProxyMode.TARGET_CLASS)
    • Если у вас нет доступа к компоненту видимости, вы можете объявить точку внедрения как ObjectProvider<> для того, чтобы получить прокси области.

Дополнительную информацию об этой проблеме можно найти здесь: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html

Другие вопросы по тегам