1

以下代码正在使用请求范围的托管 Bean,并且消息显示在p:messages标记中:

FacesContext context = FacesContext.getCurrentInstance();

public void addAction() {
    if(commande.exists()) {
                context.addMessage("Commande", new FacesMessage(
                        FacesMessage.SEVERITY_ERROR,"Error Message : commande exists", null));
    } else {
        commandeService.create(commande);
    }
}

当我尝试在视图范围的托管 Bean 中使用它时,它会在记录器中显示一条错误消息:

Error the FacesContext is already released!

并且 JSF 页面挂起而不显示面孔消息。

4

1 回答 1

1

永远不应该将 的当前实例FacesContext或其任何属性分配为托管 bean 的属性。当前实例仅在当前 HTTP 请求中有效,在 HTTP 请求结束时被销毁,在任何后续 HTTP 请求中不再有效。

您应该始终在方法本地范围内获取当前实例。

public void addAction() {
    if (commande.exists()) {
        FacesContext.getCurrentInstance().addMessage("Commande", new FacesMessage(
            FacesMessage.SEVERITY_ERROR, "Error Message : commande exists", null));
    } else {
        commandeService.create(commande);
    }
}
于 2013-03-21T12:58:09.293 回答