[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标定为调用失败,事务回滚等等。。



这里有么有人出来喊一声,这个异常是怎么回事??
Global site tag (gtag.js) - Google Analytics