我正在使用 JSF 2,并且在使用某些 Web 服务时遇到了一些异常,我想捕获该异常并在我的.xhtml
页面上显示该消息。
我怎样才能做到这一点?
我正在使用 JSF 2,并且在使用某些 Web 服务时遇到了一些异常,我想捕获该异常并在我的.xhtml
页面上显示该消息。
我怎样才能做到这一点?
您可以使用该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 的消息)
为了给你一个 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_ERROR
)FacesMessage
。facesContext
如果您没有提供任何错误消息,则使用默认字符串作为消息添加创建的错误消息。
由于此方法能够创建全局和 clientId 相关的错误消息,因此您不必使用globalOnly
属性。只需指定<h:messages/>
让标签显示您的所有消息(全局或非全局)。
同样,这只是示例代码。您可能需要调整/改进以使其成为您自己的。此外,您几乎可以复制此方法来处理信息消息。
作为处理错误消息的通用方法,您可以在每个控制器都将扩展的超类中使用此方法。