Skip to main content
 首页 » 编程设计

spring-boot中在 JoinFaces ViewScope 中找不到 FacesContext

2025年12月25日31tuyile006

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

范围“ View ”对于当前线程不活动;如果您打算从单例中引用该 bean,请考虑为此 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException:未找到 FacesContext。

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

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

我们感谢每一个提示!

请您参考如下方法:

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

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

  1. 尝试对您的 Bean 进行建模,使其仅依赖于具有相同或更高范围的 Bean。 (因此应用程序范围的bean只能使用应用程序范围的bean, View 范围的bean可以使用 View 、 session 或应用程序范围的bean等)
  2. 当您 100% 确定您的应用程序范围 Bean 在处理 JSF 请求期间仅使用 View 范围 Bean 时,您可以自动或手动将该 Bean 包装在范围代理中。
    • 要自动获取范围代理,请更改 @ViewScoped@Scope(scopeName = "view", proxyMode = ScopedProxyMode.TARGET_CLASS)
    • 如果您无权访问 View 作用域 bean,则可以将注入(inject)点声明为 ObjectProvider<>为了获得有范围的代理。

有关此问题的更多信息可以在此处找到:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-scopes-other-injection