如何在Session Scoped bean中使用ViewScoped bean?

时间:2014-01-22 06:31:55

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

我有三个托管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的功能。 任何想法?

3 个答案:

答案 0 :(得分:5)

这只表示模型中的设计问题。这表明视图作用域bean类A具有“太多”代码逻辑,并且其代码应该重构为不同的可重用类,而后者又可以由会话作用域bean类S和视图作用域bean类A使用。{ {3}}等等。也许它代表了实际需要在EJB中的业务服务代码?

在任何情况下,可以通过将视图范围bean A作为会话范围bean S的操作方法的方法参数传递来实现该要求。

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

但这也是一种设计气味。您需要确保为bean保存的数据/状态选择正确的范围。另请参阅Law of Demeter

答案 1 :(得分:1)

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

您将bean A声明为视图范围,意味着您不希望它在视图更改后生效。因此,在会话范围内注入它会滥用其规则。

答案 2 :(得分: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。

希望这有帮助。