如何在应用程序启动时禁用 Java EE 拦截器,例如根据数据库 logger=info 的条件?

How can I disable Java EE interceptor on application start up, for example by condition from database logger=info?

我使用 Java EE 和 WebLogic 服务器。我声明带有注释样式的拦截器:@Interceptor。我需要添加一些功能来禁用某些拦截器。我在Interceptor需要调用的时候用annotation来标记方法


@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Traced {
}

 @Traced
    @Interceptor
    @Priority(Interceptor.Priority.APPLICATION)
    public class MethodInvocationInterceptor implements Serializable {

        private static final Logger LOG = Logger.getLogger(MethodInvocationInterceptor.class);

        @AroundInvoke
        public Object intercept(final InvocationContext ctx) throws Exception {
          LOG.trace(ctx.getMethod().getName() + " method started");
        return ctx.proceed();
      }

我能想到三种合理的方法。

首先与@Nikos 的建议相同,始终保持启用拦截器并仅根据配置添加条件逻辑。

第二种方法需要在您监视 AfterTypeDiscovery event 的地方使用 CDI 扩展。这允许您获得备选方案、拦截器和装饰器的列表。这些列表是可变的,一旦您更改它们,容器就必须考虑更改值。删除拦截器应该会导致拦截器被禁用。

此方法再次使用 CDI 扩展,需要您监视 AnnotatedType of interceptor using ProcessAnnotatedType event 并使用 veto() 方法禁用它。或者,如果否决没有削减它,您可以更改 AnnotatedType 和 remove/replace 拦截器绑定(尽管这种方法听起来有点 "hacky" 因为您以没有绑定的拦截器结束)。