我有三个托管的bean:一个会话范围(s)和两个视图(a,b)。我想在S和B中使用A的功能。但是问题在于,在会话范围内注射视图scoped bean是不可能的。
The scope of the object referenced by expression #{a}, view, is shorter than the referring managed beans (s) scope of session
我不想复制A的功能。有什么想法吗?
这仅表示您的模型中的设计问题。这表明查看范围bean a类具有"太多"代码逻辑,并且应将其代码重构为一个可重复使用的类,而这又可以由两个会话scoped scoped bean s类并查看scoped bean类A使用。Demeter等。也许它代表了实际需要在EJB中的业务服务代码?
在任何情况下,您可以通过传递视图scoped bean作为sected scoped bean S的方法参数来实现要求。
<h:commandXxx ... action="#{sessionScopedBean.doSomething(viewScopedBean)}" />
,但这也是一种设计气味。您需要绝对确保选择适合bean拥有的数据/状态的正确范围。另请参阅如何选择合适的Bean范围?
错误非常明显。会话范围大于视图范围。因此,您不能在会话范围中使用它。您必须更改范围。
您将bean a声明为视图范围,意味着您不希望它在更改之后生存。因此,将其注入会话范围正在滥用其规则。
我弄清楚了。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。
希望这会有所帮助。