在 JoinFaces ViewScope 中找不到 FacesContext

No FacesContext found in JoinFaces ViewScope

我们目前正在使用 JoinFaces 3.2.5 将一个相当大的项目从 JavaEE (Wildfly) 迁移到 Spring Boot 2.0.5 以获得 JSF 支持。不幸的是,当启动服务器时,我们总是收到以下消息:

Scope 'view' 对当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException:找不到 FacesContext。

有问题的 UI bean 是一个 Spring 组件,另外用 javax.faces.view.ViewScoped 注释(如 joinfaces-maven-jar-example 中的 class StarterMBean)。

有什么特别需要我们注意的吗,例如禁止依赖项、特殊配置等?

我们感谢每一个提示!

您有一个 singleton/application 作用域 bean,它直接或间接依赖视图作用域 bean。这会强制 BeanFactory 在应用程序启动时构造视图范围的 bean,但是视图范围的 bean 只能在当前正在处理 JSF 请求的线程中使用。

有多种方法可以解决这个问题:

  1. 尝试将您的 bean 建模为仅依赖于具有相同或更高范围的 bean。 (因此应用程序范围的 beans 只能使用应用程序范围的 beans,视图范围的 beans 可以使用视图、会话或应用程序范围的 beans 等等)
  2. 当您 100% 确定您的应用程序作用域 bean 在处理 JSF 请求期间将仅使用视图作用域 bean 时,您可以自动或手动将 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