Не найдено FacesContext в JoinFaces ViewScope - PullRequest
0 голосов
/ 28 сентября 2018

В настоящее время мы переносим довольно большой проект с 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-example).).

Есть ли что-то особенное, к чему мы должны быть осторожны, например, запрещенные зависимости, специальные конфигурации и т. Д.?

Мы благодарны за каждую подсказку!

1 Ответ

0 голосов
/ 14 октября 2018

У вас есть синглтон / bean-объект области действия, который имеет прямую или косвенную зависимость от bean-объекта области действия.Это заставляет BeanFactory создавать bean-объект области видимости при запуске приложения, но bean-объекты вида могут использоваться только в потоках, которые в данный момент обрабатывают запрос JSF.

Существует несколько способов решения этой проблемы:

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

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

...