如何在Sesionscoped Bean中使用ViewScoped Bean



我有三个托管的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。

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新