我有三个托管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的功能。 任何想法?
答案 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。
希望这有帮助。