莫因!
我遇到这种情况,我尝试使用p:message
显示错误消息,以获取在getter中引发的异常。但这导致了消息"WARNUNG: There are some unhandled FacesMessages, this means not every FacesMessage had a chance to be rendered."
。
我执行以下操作将消息附加到FacesContext:
FacesContext.getCurrentInstance().addMessage(cliendId, getFacesMessage(severity, msgKey, args));
我认为无法呈现消息,因为在getter中创建消息会发生在渲染它的阶段......
有没有办法在getter中创建消息而不是在动作中? 也许可以重置渲染阶段?
答案 0 :(得分:4)
我需要从外部系统加载数据。我在bean-getters中访问了外部服务器。如果是networkerror,我想显示错误消息
使用getter方法执行业务工作是错误的方法。在JSF托管bean中,getter不应该只做返回数据或者至少对已经可用的属性做一些预先计算。您不应该在getter方法中分配属性值,或者它必须用于延迟加载。
在视图的呈现期间调用getter。在您的特定情况下,在呈现<p:messages>
之后,很明显地会调用getter ,因此它永远不会有机会显示稍后添加的faces消息。
将业务作业移动到辅助bean的(post)构造函数或(action)侦听器方法。
E.g。在postconstruct方法:
@PostConstruct
public void init() {
try {
data = loadFromWebservice();
} catch (SomeException e) {
log(e);
addFacesMessage();
}
}
您当然也可以将<p:messages>
移动到页面的最底部(如果需要,可以使用CSS重新定位),但这更像是一种解决方法而非解决方案。
答案 1 :(得分:1)
p:消息说你正在使用PrimeFaces。这可能是一个AJAX调用,p:message组件在此调用时未更新。这是一个常见的错误。
答案 2 :(得分:0)
替代方案,您也可以使用<p:growl>
来显示FacesMessages。
<p:message>
与<p:growl>
类似。
<p:message>
和<p:growl>
都可以显示特定的FacesMessages。
始终检查您的严重性设置。
如果您使用例如:
<p:growl id="growl" showDetail="true" severity="info,warn" sticky="false"/>
<p:growl id="errorGrowl" showDetail="true" severity="error" sticky="true" />
生成具有严重性错误的FacesMessage并将其置于false组件(growl),您将收到消息“警告:有一些未处理的FacesMessages,这意味着并非每个FacesMessage都有机会被渲染。”
显示错误消息的正确方法是:
public void saveError( FacesMessage facesMessage )
{
FacesContext.getCurrentInstance().addMessage( "errorGrowl", facesMessage );
update( "errorGrowl" );
}