如何通过侦听器调用技术异常

时间:2014-01-15 12:51:14

标签: jsf jsf-2

我使用附加了valueChangeListener属性的<h:selectOneMenu>。侦听器调用一些业务代码(例如,DB查询)以基于新选择的值加载附加数据。我注意到,当代码中发生(意外)异常时,AbortProcessingException会包装原始异常,后面跟着一个日志,但没有通知用户出现了问题。

有没有办法在调用监听器时通知用户意外发生了意外错误?

我从Differences between action and actionListener知道一个动作更适合这样的表达式,但我不能在<h:selectOneMenu>中设置动作,而只能在听众中设置动作。我该如何更改我的页面,以便进行真实的商业行为&#34; (当允许失败的一个)在所选项目发生变化时被调用?

1 个答案:

答案 0 :(得分:0)

JSF有FacesMessages的概念。这些是在<h:messages />标记的帮助下呈现的。通常做的是捕获任何异常并向FacesContext添加javax.faces.application.FacesMessage,为用户提供他需要的信息(另请参阅"catch exception in managed bean and show message on screen in jsf2")。

FacesContext.getCurrentInstance().addMessage(
    null, 
    new FacesMessage(Severity.INFO, <see details for possible fills>)
);

还有一种方法可以引入自己的ExceptionHandlerFactory - 就像文章"Global handling of all unchecked / unexpected exceptions in JSF 2"中提到的那样 - 你有没有检查过这种可能性? (另见this answer/comment to BalcusCs article

作为可能性2,您可以例如selectOneMenu更改后使用ajax-request并触发另一个监听器(稍后执行ValueChangedListener并将AjaxBehaviorEvent作为参数,我觉得更有帮助在BL - 侧)。这是一些元代码...

<h:selectOneMenu ...>
  <f:selectItems ... />
  <f:ajax render="..." execute="..." listener="..." />
</h:selectOneMenu>

希望它有所帮助...