在JoinFaces ViewScope中找不到FacesContext

时间:2018-09-28 07:49:51

标签: spring-boot joinfaces

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

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

有问题的UI Bean是一个Spring组件,另外还用javax.faces.view.ViewScoped进行了注释(例如joinfaces-maven-jar-example中的StarterMBean类)。

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

我们非常感谢每一个提示!

1 个答案:

答案 0 :(得分:1)

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

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

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