如何在SessionScoped bean中使用ViewScoped bean?

3

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

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

我不想重复 A 的功能。有什么想法吗?
3个回答

6
这只是您的模型存在设计问题的表现。这意味着视图作用域的Bean类A具有“过多”的代码逻辑,应将其重构为一个不同的、可重用的类,然后由会话作用域的Bean类S和视图作用域的Bean类A共同使用。参考迪米特法则等。也许它代表了实际上需要在EJB中的业务服务代码?
无论如何,您可以通过将视图作用域的Bean A作为会话作用域的Bean S的操作方法的方法参数来实现要求。
<h:commandXxx ... action="#{sessionScopedBean.doSomething(viewScopedBean)}" />

但这也是一种设计问题。你需要确保选择正确的作用域来容纳bean所持有的数据/状态。参见如何选择正确的bean作用域?


1
错误很明显。会话范围大于视图范围。因此,您不能在会话范围中使用它。您需要更改作用域。
您将Bean A声明为视图范围,这意味着您不希望它在视图更改后继续存在。因此,在会话范围中注入它是滥用其规则。

你可以将A的作用域更改为sessionscope,或将S的作用域更改为viewscope。 - Madhura
我真的需要A在视图中,S在会话中! - Farvardin
2
不,你不能使用它。即使你这样做了,也没有任何意义。如果你想让你的变量在会话作用域bean中被访问而不是视图作用域,你应该将它们放在你的会话作用域bean中。分享你的代码,这样我可以帮助你找到一些解决方法。 - Madhura
1
S 只需要关注会话相关的事情,而不是 A 的具体细节,这些细节必须与视图相关。您可以让 A 访问 S,以通知它有关更改的信息。 - Aritz

0

我想通了。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。

希望这可以帮助到您。


这完全是相反于所要求的。 - martinyyyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接