我正在使用Primefaces进行ajax提交,但我无法将我的服务器端消息与我的ajax请求相关联。 假设我有一个调用动作的按钮。 在我的托管bean中,我是否需要引发异常?如何将此消息传递到我的ajax请求
public void checkout(ActionEvent event){
if(expression){
throw new CustomException("Account balance is not enough!");
}
}
public class CustomException extends RuntimeException {
public CustomException(String message) {
super(message);
}
}
我该如何处理这个案子?我的onerror javascript方法能够处理这个吗?
此外,在一种情况下,假设DB已关闭,那么我该如何处理异常呢?我是否已访问该错误消息 在我的javascript函数中?
public void checkout(ActionEvent event){
try{
//DB is down
if(expression){
throw new CustomException("Account balance is not enough!");
}
}catch(Exception e){
}
}
答案 0 :(得分:4)
至于你的具体问题,你需要为此实现一个自定义ExceptionHandler
,当ajax请求中发生异常时基本以下内容:
String errorPageLocation = "/WEB-INF/errorpages/500.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();
如果您想将web.xml
错误页面考虑在内,这并非完全无关紧要。您需要解析整个web.xml
以查找错误页面位置。 OmniFaces实用程序库具有这样的异常处理程序FullAjaxExceptionHandler
。您可以找到完整的源代码here和展示示例here。
至于你的具体功能要求,当出现用户错误时我不会抛出异常。这是完全可以恢复的。您需要创建并添加FacesMessage
并使用ajax更新<h:messages>
,<p:messages>
或<p:growl>
。 PrimeFaces支持autoUpdate="true"
,它会在ajax请求上自动更新自己。 E.g。
context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Insufficient balance", null));
与
<p:messages autoUpdate="true" />
抛出异常仅在不可恢复的情况下才有意义,例如当数据库关闭时。请注意,您通常不会自己抛出这样的异常。在JPA的情况下,它已经被抛出为PersistenceException
,而你反过来不应该在JSF托管bean中捕获,但只是放手。