【问题标题】:how to use ViewScoped bean in SesionScoped bean?如何在 SesionScoped bean 中使用 ViewScoped bean?
【发布时间】:2014-02-12 02:09:58
【问题描述】:

我有三个托管 bean:一个会话范围 (S) 和两个视图范围 (A,B)。 我想在 S 和 B 中使用 A 的功能。 但问题是在会话范围内注入视图范围 bean 是不可能的。

The scope of the object referenced by expression #{a}, view, is shorter than the referring managed beans (s) scope of session

我不想复制 A 的功能。 有什么想法吗?

【问题讨论】:

    标签: jsf jsf-2 dependency-injection view-scope session-scope


    【解决方案1】:

    错误很明显。会话范围大于视图范围。因此,您不能在会话范围内使用它。你必须改变你的范围。

    您将 bean A 声明为视图范围,这意味着您不希望它在视图更改后继续存在。所以在会话范围内注入它是在滥用它的规则。

    【讨论】:

    • 您可以将A的范围更改为sessionscope或将S的范围更改为viewscope
    • 我真的需要 A 在视野中,S 在会话中!
    • 不,你不能使用它。即使你这样做了,它也没有任何意义。如果您希望在会话范围 bean 而不是视图范围中访问变量,则应将它们放在会话范围 bean 中。分享您的代码,以便我可以为一些解决方法提供更多帮助
    • S 应该只关心会话问题。从来没有关于 A 的细节,这必须与视图相关。您可以改为让 A 访问 S,以通知它有关更改。
    【解决方案2】:

    这只是表明您的模型中存在设计问题。这表明视图作用域 bean 类 A 的代码逻辑“太多”,它的代码应该重构为不同的、可重用的类,而会话作用域 bean 类 S 和视图作用域 bean 类 A 又可以使用该类。@ 987654321@等。也许它代表实际需要在 EJB 中的业务服务代码?

    无论如何,您可以通过将视图范围 bean A 作为会话范围 bean S 的操作方法的方法参数传递来实现要求。

    <h:commandXxx ... action="#{sessionScopedBean.doSomething(viewScopedBean)}" />
    

    但这也是一种设计味道。您需要确保为 bean 保存的数据/状态选择正确的范围。另见How to choose the right bean scope?

    【讨论】:

      【解决方案3】:

      我想通了。 JSF 改变了你注入东西的方式。看下面的正确方法:

      @Named(value = "propertyFEnd")
      @ViewScoped
      public class PropertyFEnd implements Serializable {
      
          @Inject @ManagedProperty("#{userFEnd}")
          private UserFEnd userfend;
      
           **** plus getter/setter for userfend ***
      
           **** your code ****
      
      }
      

      不要在顶部使用@ManagedBean!!!!注意:UserFEnd 是一个会话 bean。

      希望这会有所帮助。

      【讨论】:

      • 这与所要求的完全相反
      猜你喜欢
      • 2011-06-08
      • 2018-07-25
      • 2014-03-29
      • 2014-02-14
      • 2015-04-15
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多