[weld] 关于weld中的一个bug
lonvea
2010-04-07
这个问题徘徊了我很长时间。。但是后来,确认为weld的一个bug,jboss将在weld1.2中修复。。
大概是这样的。。大家很多时候会用到拦截器,在weld中拦截器和spring中的拦截器不同,你可以简单的认为weld中的拦截器,其实就是在蹩脚的使用EJB中的拦截器机制硬套在POJO上。。所以拦截器的异常抛出机制也是一直的。。 很多时候我们会在拦截器中声明自定义异常,如一个权限控制的拦截器,在用户权限不足时抛出NOPermissionException,然后这个异常有系统总体控制。 1)异常 public class NoPermissionException extends RuntimeException{...} 2)拦截器 @Permission @Interceptor public class PermissionInterceptor { @AroundInvoke public Object invoke(InvocationContext ctx) throws Exception{ throws NoPermissionException(); } } 3)ExceptionFilter @WebFilter(filterName = "UserFilter", urlPatterns = { "*.jspx" }) public class ExceptionFilter implements Filter { .............. try { ............. } catch (NoPermissionException e) { httpResponse.sendRedirect(contextPath + ERROR_PAGE); } catch (Exception e) { httpResponse.sendRedirect(contextPath + LOGIN_PAGE); } ................ } 4)流程 UserAO调用UserBO.findUsers()方法,findUsers()方法被拦截器拦截。当然拦截器的时候,肯定会抛出NoPermissionException,但是这个异常在UserAO中catch的话,能捕获到。但是如果在Filter中捕获的话,根本捕获不到,这个异常在拦截器回调结束之后直接被封装成InvokeTargetExcetpion,JSF请求调用结束后(应该说调用失败),JSF再次封装异常成为ExcudeException,此异常会继续上抛进入servlet容器处理,被再次封装成ServletException,最后在请求结束,到达filter时,Exception已经面目全非了。。自定义异常无法找到。。。 我认为weld不应该对runtime的自定义异常进行封装,而是一直抛出。。。但是这个或许是EJB曾经的问题,EJB是不捕获runtimeExcetpion已近各种unchecked异常。EJB只会把remoteException已经EJBExcetpion标定为调用失败,事务回滚等等。。 这里有么有人出来喊一声,这个异常是怎么回事?? |