1

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

我怎样才能做到这一点?

4

2 回答 2

3

您可以使用try-catch来捕获和处理异常。您可以使用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"将强制<h:messages>只显示带有null客户端 ID 的消息)

于 2012-11-09T00:04:15.053 回答
0

为了给你一个 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 为空)错误(因为FacesMessage.SEVERITY_ERRORFacesMessagefacesContext如果您没有提供任何错误消息,则使用默认字符串作为消息添加创建的错误消息。

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

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

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

于 2012-11-09T14:38:00.187 回答