CDI 扩展 - 在 ProcessAnnotatedType 阶段添加拦截器
CDI Extensions - Add Interceptors in ProcessAnnotatedType phase
我正在尝试以编程方式添加拦截器。拦截器称为 LogginInterceptor 并且只记录它运行的方法的名称。当在方法上使用注释 @Interceptors(LogginInterceptor.class) 时,一切正常。
然而,我正在尝试创建 CDI 扩展,以编程方式将此 @Interceptors(LogginInterceptor) 注释添加到某个 class 的每个方法(简单来说)。所以,试试吧,我用几种方法创建了 class 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());
}
}
我正在为 AnnotationInstanceProvider 和 AnnotatedTypeBuilder 使用 Apache Deltaspike。注释以及包装 AnnotatedType 已创建。但是,拦截器不起作用。
我使用 WildFly 9。
PS:我还注意到拦截器绑定对我不起作用。只有@Interceptors 注释有效。
非常感谢您的任何建议。
最好通过 AnnotatedTypeBuilder#addToClass 将注释实例添加到整个 bean。不要忘记为每个存档启用拦截器(通过 beans.xml)或通过@javax.annotation.Priority 全局启用拦截器。您甚至可以动态创建它的一个实例并将其添加到您的拦截器实现 class(用 @Interceptor 注释)。没有它,您的 @InterceptorBinding 根本无法工作。
我正在尝试以编程方式添加拦截器。拦截器称为 LogginInterceptor 并且只记录它运行的方法的名称。当在方法上使用注释 @Interceptors(LogginInterceptor.class) 时,一切正常。
然而,我正在尝试创建 CDI 扩展,以编程方式将此 @Interceptors(LogginInterceptor) 注释添加到某个 class 的每个方法(简单来说)。所以,试试吧,我用几种方法创建了 class 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());
}
}
我正在为 AnnotationInstanceProvider 和 AnnotatedTypeBuilder 使用 Apache Deltaspike。注释以及包装 AnnotatedType 已创建。但是,拦截器不起作用。
我使用 WildFly 9。
PS:我还注意到拦截器绑定对我不起作用。只有@Interceptors 注释有效。
非常感谢您的任何建议。
最好通过 AnnotatedTypeBuilder#addToClass 将注释实例添加到整个 bean。不要忘记为每个存档启用拦截器(通过 beans.xml)或通过@javax.annotation.Priority 全局启用拦截器。您甚至可以动态创建它的一个实例并将其添加到您的拦截器实现 class(用 @Interceptor 注释)。没有它,您的 @InterceptorBinding 根本无法工作。