【问题标题】:CDI Extensions - Add Interceptors in ProcessAnnotatedType phaseCDI 扩展 - 在 ProcessAnnotatedType 阶段添加拦截器
【发布时间】:2024-10-05 08:40:01
【问题描述】:

我正在尝试以编程方式添加拦截器。拦截器称为 LogginInterceptor 并且只记录它运行的方法的名称。当在方法上使用注释 @Interceptors(LogginInterceptor.class) 时,一切正常。

然而,我正在尝试创建 CDI 扩展,以编程方式将此 @Interceptors(LogginInterceptor) 注释添加到某个类的每个方法(简单起见)。所以,试试吧,我用几个方法创建了 Hello 类。当这些方法被手动注释时,LogginInterceptor 工作并打印方法的名称。但是,我通过 CDI 扩展以编程方式添加的代码不起作用。

    <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {

    if (pat.getAnnotatedType().getJavaClass().equals(Hello.class)) {
        Logger.getLogger("").info("Initial annotations: " + pat.getAnnotatedType().getAnnotations());


        Map<String, Class[]> values = new HashMap<>();
        Class[] classes = {LoggingInterceptor.class};
        values.put("value", classes);
        Interceptors interceptors = AnnotationInstanceProvider.of(Interceptors.class, values);
        AnnotatedTypeBuilder<T> builder = new AnnotatedTypeBuilder<T>().readFromType(pat.getAnnotatedType());

        pat.getAnnotatedType().getMethods().forEach(method -> {
            builder.addToMethod(method, interceptors);
        });

        pat.setAnnotatedType(builder.create());
        Logger.getLogger("").info("Ending annotations: " + pat.getAnnotatedType().getAnnotations());
    }
}

我将 Apache Deltaspike 用于 AnnotationInstanceProvider 和 AnnotatedTypeBuilder。注释被创建,以及包装 AnnotatedType。但是,拦截器不起作用。

我使用 WildFly 9

PS:我还注意到拦截器绑定对我不起作用。只有@Interceptors 注解有效。

感谢您的任何建议。

【问题讨论】:

    标签: java jakarta-ee cdi jboss-weld weld


    【解决方案1】:

    最好通过 AnnotatedTypeBuilder#addToClass 将注解实例添加到整个 bean。不要忘记启用每个存档的拦截器(通过 beans.xml)或通过@javax.annotation.Priority 全局启用。您甚至可以动态创建它的实例并将其添加到您的拦截器实现类(使用@Interceptor 注释)。否则,您的 @InterceptorBinding 根本无法工作。

    【讨论】:

    • 我忘记在 beans.xml 中将其定义为拦截器。这就是问题所在。谢谢。