2013-03-21 48 views
1

下面的代码正在与请求范围托管Bean和消息被显示在p:messages标签:错误FacesContext中已经释放

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页面挂起而不显示faces消息。

回答

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); 
    } 
} 
+0

谢谢,它的工作原理。对于请求bean,上下文属性已针对每个调用进行了初始化,因此隐藏了该错误,但对于视图范围的bean,它是不同的。 – faissal 2013-03-21 14:01:13