【问题标题】:catch exception in managed bean and show message on screen in jsf2在托管 bean 中捕获异常并在 jsf2 的屏幕上显示消息
【发布时间】:2012-11-08 20:32:03
【问题描述】:

我正在使用 JSF 2,并且在使用某些 Web 服务时遇到了一些异常,我想捕获该异常并在我的 .xhtml 页面上显示消息。

我该怎么做?

【问题讨论】:

    标签: jsf-2 exception-handling


    【解决方案1】:

    您可以使用the try-catch block 来捕获和处理异常。您可以使用FacesContext#addMessage() 将面孔消息添加到面孔上下文。您可以使用<h:messages> 显示面孔消息。

    所以,bean 中有这样的东西:

    try {
        data = yourWebService.retrieve();
    } catch (YourWebServiceException e) {
        String message = "Failed to retrieve data from webservice: " + e.getMessage());
        FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage(FacesMessage.SEVERITY_INFO, message, null));
        e.printStackTrace(); // Or use a logger.
    }
    

    这在 JSF 页面中:

    <h:messages globalOnly="true" />
    

    globalOnly="true" 将强制 &lt;h:messages&gt; 仅显示带有 null 客户端 ID 的消息)

    【讨论】:

    • 它对我不起作用,或者可能是我做错了什么。我有一个方法,我传递 URL,那是一个异步调用,所以我没有得到任何响应。但是当我发送错误的 URL 时,它会抛出 WebApplicationException。而且我不确定我是否正确使用了该 选项卡。我试图在我的 tabview 开始的地方使用它。请让我知道我做错了什么。谢谢
    • 如果您出示 SSCCE 会很有帮助。这里有太多的歧义。如果您以正确的方式使用 JSF,那么只需在 &lt;f:ajax render&gt; 中引用消息组件即可。
    【解决方案2】:

    为了给您一个 BalusC 解释的示例,您可以编写一个在 catch 语句中调用的简单方法。

    private void addErrorMessage(String msg, String clientId) {
            String codingErrorMsgKey = "coding_error_msg";
            FacesMessage fm;
            FacesContext facesContext = FacesContext.getCurrentInstance();
            if (StringUtils.isEmpty(msg)) {
                ResourceBundle bundle = facesContext.getApplication().getResourceBundle(facesContext, "bundle");
                fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString(codingErrorMsgKey), bundle.getString(codingErrorMsgKey));
            }
            else {
                fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
            }
            facesContext.addMessage(clientId, fm);
        }
    

    这个方法的作用非常简单:你给它一个消息,你可能已经从应用程序的资源包中解决了,然后是一个全局错误(仅当 clientId 为 null 时)(因为 FacesMessage.SEVERITY_ERRORFacesMessage 是创建。如果您未提供任何消息,则使用默认字符串作为消息,然后将创建的错误消息添加到 facesContext

    由于此方法能够创建全局和 clientId 相关的错误消息,因此您不必使用 globalOnly 属性。只需指定 &lt;h:messages/&gt; 即可让标签显示您的所有消息(全局或非全局)。

    同样,这只是示例代码。您可能需要调整/改进以使其成为您自己的。此外,您几乎可以复制此方法来处理信息消息。

    作为一种处理错误消息的通用方法,您可以在超类中使用此方法,然后每个控制器都将扩展该超类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2013-12-13
      • 2015-11-26
      相关资源
      最近更新 更多