在JSF应用中捕捉managed-bean构造方法

开发 后端
本文介绍在JSF应用中捕捉managed-bean构造方法,有时候需要在managed-bean构造方法里执行一些逻辑代码,这时如果抛出了异常,该如何捕捉呢?

有时候需要在managed-bean构造方法里执行一些逻辑代码,这时如果抛出了异常,该如何捕捉呢?

JSF的事件被执行时,如果在事件处理方法中抛出了Exception,我们可以通过JSF提供的ActionListener机制catch到抛出的Exception,然后根据Exception类型执行不同的错误处理。

但有时候需要在managed-bean构造方法里执行一些逻辑代码,这时如果抛出了异常,该如何捕捉呢?
你可能会想到在Filter里加以捕捉处理,但不幸的是,你在Filter里只能捕捉到经过被加工了的Exception:ServletException,而且你也没办法将其还原成最初被抛出的Exception。

要达到这个目的,我们可以利用JSF框架提供的variable-resolver切入点。因为JSF的managed-bean的instance,就是由variable-resolver所定义类所生成的。
所以我们可以借助JSF提供的机制,注册我们自己的variable-resolver类,从而就可以捕捉到managed-bean构造方法执行时抛出的异常了。

具体方法为:
自定义一个VariableResolverImpl类,该类需要实现虚类javax.faces.el.VariableResolver,为了简便起见,我们可以根据情况,重载所使用的JSF实现里的相关类就可以了,比如MyFaces的情况下,重载 org.apache.myfaces.el.VariableResolverImpl. resolveVariable方法就可以了。
代码如下:

  1. package mypackage;        
  2. import javax.faces.context.FacesContext;    
  3. import javax.servlet.http.HttpServletRequest;       
  4.  public class VariableResolverImpl extends    
  5.          org.apache.myfaces.el.VariableResolverImpl {    
  6.      private static final String ERROR_FLAG = "error";    
  7.       private static final String EXCEPTION_TYPE = "exception";       
  8.      @Override    
  9.      public Object resolveVariable(FacesContext facesContext, String name) {    
  10.          try {    
  11.              return super.resolveVariable(facesContext, name);    
  12.          } catch (Throwable e) {    
  13.              HttpServletRequest request = (HttpServletRequest)facesContext.                                                getExternalContext().getRequest();    
  14.              request.setAttribute(ERROR_FLAG, Boolean.TRUE);    
  15.              request.setAttribute(EXCEPTION_TYPE, e);    
  16.             throw new RuntimeException(e);    
  17.          }    
  18.      }       
  19.  }   

在faces-config.xml里注册刚才实现的类,让JSF使用我们提供的类解析变量

  1. <faces-config>    
  2. <!--  Application Config -->    
  3. <application>    
  4.    <variable-resolver>mypackage.VariableResolverImpl</variable-resolver>    
  5.    <!-- other configuration here -->    
  6. </application>    
  7. <!-- other configuration here -->   
  8. </faces-config>   

在其他地方处理异常,比如Filter里

  1. public class AppFilter implements Filter {    
  2.    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,    
  3.             ServletException {    
  4.        try {    
  5.           chain.doFilter(request, response);    
  6.        } catch (ServletException e) {                
  7.           Boolean error =  (Boolean)request.getAttribute("error");    
  8.            if (Boolean.TRUE.equals(error)) {    
  9.               Throwable te = (Throwable)request.getAttribute("exception");                     
  10.                if (te instanceof AppException) {    
  11.                    //TODO do business here    
  12.                         
  13.                 } else {    
  14.                    //TODO do business here    
  15.            }    
  16.           } else {    
  17.           //TODO do business here    
  18.         }    
  19.         }    
  20. }   

 

【编辑推荐】

  1. JSF和Spring的集成
  2. JSF中使用自定义Navigation
  3. 简单介绍JSF应用
  4. JSF动态生成固定表头和行标的DataTable
  5. JSF和JSP是一对新的搭档
责任编辑:佚名 来源: JavaEye
相关推荐

2009-07-14 15:31:26

MyEclipse开发

2009-06-22 17:26:26

页面导航JSF

2009-06-24 14:59:00

图形bean组件JSF图形组件

2009-06-22 15:39:45

JSFGlassFish管理

2009-06-23 13:01:04

JSF应用

2009-06-26 17:27:15

JSF文件

2009-06-12 18:35:33

JSF f:loadB

2009-06-23 09:33:20

FCKEditorJSFJSP

2009-06-24 17:05:10

2010-07-16 17:04:38

Perl方法

2009-06-23 16:52:16

JSFHibernateWeb应用

2009-06-29 14:19:50

2010-01-18 09:37:39

JSF 2.0Java EE 6

2009-12-29 09:15:00

2010-09-30 09:42:06

2009-06-24 10:34:39

JSF生命周期JSF应用程序

2009-09-23 17:56:45

JSF入门

2010-09-30 10:03:53

2020-12-28 05:54:37

构造builder模式

2021-03-11 08:32:58

参数模式构造
点赞
收藏

51CTO技术栈公众号