CDI扩展 – 在ProcessAnnotatedType阶段添加拦截器

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

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

 void processAnnotatedType(@Observes ProcessAnnotatedType pat) { if (pat.getAnnotatedType().getJavaClass().equals(Hello.class)) { Logger.getLogger("").info("Initial annotations: " + pat.getAnnotatedType().getAnnotations()); Map values = new HashMap(); Class[] classes = {LoggingInterceptor.class}; values.put("value", classes); Interceptors interceptors = AnnotationInstanceProvider.of(Interceptors.class, values); AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder().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 for AnnotationInstanceProvider和AnnotatedTypeBuilder。 创建注释,以及包装AnnotatedType。 但是,拦截器无法正常工作。

我使用WildFly 9

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

谢谢你的任何建议。

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