【发布时间】:2012-11-08 20:32:03
【问题描述】:
我正在使用 JSF 2,并且在使用某些 Web 服务时遇到了一些异常,我想捕获该异常并在我的 .xhtml 页面上显示消息。
我该怎么做?
【问题讨论】:
我正在使用 JSF 2,并且在使用某些 Web 服务时遇到了一些异常,我想捕获该异常并在我的 .xhtml 页面上显示消息。
我该怎么做?
【问题讨论】:
您可以使用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" 将强制 <h:messages> 仅显示带有 null 客户端 ID 的消息)
【讨论】:
<f:ajax render> 中引用消息组件即可。
为了给您一个 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_ERROR)FacesMessage 是创建。如果您未提供任何消息,则使用默认字符串作为消息,然后将创建的错误消息添加到 facesContext。
由于此方法能够创建全局和 clientId 相关的错误消息,因此您不必使用 globalOnly 属性。只需指定 <h:messages/> 即可让标签显示您的所有消息(全局或非全局)。
同样,这只是示例代码。您可能需要调整/改进以使其成为您自己的。此外,您几乎可以复制此方法来处理信息消息。
作为一种处理错误消息的通用方法,您可以在超类中使用此方法,然后每个控制器都将扩展该超类。
【讨论】: