Wildfly12中Interceptor无法捕获EJBAccessException问题求助
解决Wildfly 12中拦截器无法捕获EJBAccessException的问题
你遇到的核心问题其实是EJB容器安全拦截器的执行顺序优先于自定义应用级拦截器,导致你的拦截器根本没机会处理权限校验抛出的异常。我来帮你拆解原因和解决方案:
问题根源分析
Wildfly处理@RolesAllowed这类权限校验的AuthorizationInterceptor属于容器原生的系统级拦截器,它的执行优先级远高于你设置的Interceptor.Priority.APPLICATION(默认值2000)。当权限校验失败抛出EJBAccessException时,这个异常是在你的自定义拦截器执行之前就被抛出的——相当于拦截器链还没走到你的代码就中断了,自然无法捕获到这个异常。而你能捕获其他异常,是因为那些异常是在EJB方法执行阶段抛出的,此时你的拦截器已经被调用了。
解决方案:调整拦截器执行顺序
要解决这个问题,你需要让自定义拦截器在容器安全拦截器之前执行,这样就能捕获到安全拦截器抛出的异常。
1. 修改拦截器优先级
Wildfly的AuthorizationInterceptor默认优先级是1500,你只需要把自定义拦截器的优先级设为比这个数值更小的数(数值越小,执行顺序越早)。修改你的拦截器代码:
@Throws @Interceptor @Priority(1400) // 关键:优先级低于安全拦截器的1500,确保先执行 public class myExceptionInterceptor implements Serializable { @AroundInvoke public Object check(InvocationContext invocationContext) throws Exception { try { return invocationContext.proceed(); } catch (javax.ejb.EJBAccessException e) { // 替换成你的自定义异常 throw new CustomAuthorizationException("权限不足", e); } } }
2. 明确拦截器类型(避免EJB/CDI混淆)
你的拦截器同时标注了@AroundInvoke(EJB拦截器标识)和@Interceptor(CDI拦截器标识),可能导致执行逻辑混乱。建议明确为EJB拦截器:
- 如果你依赖
ejb-jar.xml的配置,可以移除@Interceptor和自定义的@Throws绑定注解; - 保持
ejb-jar.xml中的拦截器绑定配置不变,确保覆盖所有EJB:
<interceptors> <interceptor> <interceptor-class>myExceptionInterceptor</interceptor-class> </interceptor> </interceptors> <assembly-descriptor> <interceptor-binding> <ejb-name>*</ejb-name> <interceptor-class>myExceptionInterceptor</interceptor-class> </interceptor-binding> </assembly-descriptor>
备选方案:使用Wildfly专属配置
如果上述方法无效,你可以通过jboss-ejb3.xml(Wildfly专属配置文件)强制指定拦截器顺序:
<jboss-ejb3 xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-ejb3-2_0.xsd" version="2.0"> <interceptors> <interceptor> <interceptor-class>myExceptionInterceptor</interceptor-class> <priority>1400</priority> </interceptor> </interceptors> <assembly-descriptor> <interceptor-binding> <ejb-name>*</ejb-name> <interceptor-class>myExceptionInterceptor</interceptor-class> </interceptor-binding> </assembly-descriptor> </jboss-ejb3>
注意事项
- 优先级数值是Wildfly特定的,不同版本可能略有差异。你可以开启Wildfly的DEBUG日志,查看拦截器的执行顺序来确认具体数值;
- 不要随意设置过低的优先级,避免干扰其他系统拦截器的正常执行,仅针对需要捕获
EJBAccessException的场景使用即可。
内容的提问来源于stack exchange,提问作者Praento
相关产品推荐
相关产品推荐

