【问题标题】:Displaying an error message for an error that happens in a getter, not in an action为发生在 getter 中而不是在操作中的错误显示错误消息
【发布时间】:2012-01-12 10:47:16
【问题描述】:

Moin!

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

【问题讨论】:

  • 功能需求是什么?为什么不使用Validator?
  • 我需要从外部系统加载数据。我在 bean-getters 中访问外部服务器。我想在出现网络错误时显示错误消息。我认为只有在 bean 中设置值(验证阶段)时才能使用验证器,而不是从 bean 中读取......
  • 显示消息通常与验证相关联。但是现在功能需求更明确了,确实根本不需要验证。

标签: java jsf


【解决方案1】:

我需要从外部系统加载数据。我在 bean-getters 中访问外部服务器。如果出现网络错误,我想显示错误消息

用 getter 方法做业务是错误的方法。在 JSF 托管 bean 中,getter 不应该做任何其他事情,而不仅仅是返回数据或至少对已经可用的属性进行一些预先计算。您不应该在 getter 方法中分配属性值,否则它必须用于延迟加载。

在视图的渲染期间调用getter。在您的特定情况下,getter 是在<p:messages> 被渲染之后被调用的,因此它永远没有机会显示稍后添加的面孔消息。

将业务作业移至支持 bean 的 (post) 构造函数或 (action)listener 方法。

例如在 postconstruct 方法中:

@PostConstruct
public void init() {
    try {
        data = loadFromWebservice();
    } catch (SomeException e) {
        log(e);
        addFacesMessage();
    }
}

当然,您也可以将<p:messages> 移动到页面的最底部(并在必要时使用 CSS 重新定位它),但这更像是一种解决方法而不是解决方案。

另见:

【讨论】:

  • JSF多次调用getter的链接与这个问题特别相关!
  • 感谢您的建议。我不得不按照你的建议重构它。但是我无法使用@PostConstruct,因为我有一个带有 ConversationScope 的 Bean。我用 f:event type="preRenderView" 代替。
【解决方案2】:

p:消息说您正在使用 PrimeFaces。这可能是一个 AJAX 调用,并且 p:message 组件在此调用中未更新。这是一个常见的错误。

【讨论】:

  • 我也用 h:message 试过了,还是不行...当这是一个常见错误时,是否还有一个常见的解决方案?
  • Peter Gwiazda 表示您需要使用 ajax 调用重新渲染 p:message(如果这是一个 ajax 调用)。更改为 h:message 将无济于事。
  • 我不认为这是一个 ajax 请求,因为它发生在我加载页面时
  • 您是否为导致问题的 clientId 正确设置了属性“for”?尝试添加 p:messages 组件以尝试是否捕获消息。
  • 是的,我使用了“for”属性。 p:messages 也不显示消息。
【解决方案3】:

您也可以使用 <p:growl> 向您展示 FacesMessages。

<p:message> 的作用类似于 <p:growl>。

<p:message> 和 <p:growl> 都能够显示特定的 FacesMessage。 请始终检查您的严重性设置。

如果你使用例如:

<p:growl id="growl" showDetail="true" severity="info,warn" sticky="false"/>
<p:growl id="errorGrowl" showDetail="true" severity="error" sticky="true" />

生成带有严重错误的 FacesMessage 并将其放入 false 组件(咆哮),您将收到消息“警告:有一些未处理的 FacesMessage,这意味着并非每个 FacesMessage 都有机会被渲染。”

显示错误消息的正确方法是:

public void saveError( FacesMessage facesMessage )
{
    FacesContext.getCurrentInstance().addMessage( "errorGrowl", facesMessage );
    update( "errorGrowl" );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多