显示错误消息,指出在getter中发生的错误,而不是在操作中

时间:2012-01-12 10:47:16

标签: java jsf

莫因!

我遇到这种情况,我尝试使用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中创建消息而不是在动作中? 也许可以重置渲染阶段?

3 个答案:

答案 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" );
}