1

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

范围“视图”对当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;嵌套异常是 java.lang.IllegalStateException: No FacesContext found。

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

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

我们感谢每一个提示!

4

1 回答 1

2

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

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

  1. 尝试将您的 bean 建模为仅对具有相同或更高范围的 bean 具有依赖关系。(所以应用范围的bean只能使用应用范围的bean,视图范围的bean可以使用视图、会话或应用范围的bean等等)
  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

于 2018-10-13T22:07:42.603 回答