将 CDI 拦截器注入 bean 不起作用

Injecting a CDI interceptor into a beans does not work

我创建了一个 CDI (WELD) 拦截器,它可以工作并拦截它应该拦截的内容。

@MyInterceptorBinding
@Interceptor
@Dependent
public class MyInterceptor implements Serializable {

    private int myIntegerField;
    
    @AroundInvoke
    public Object interceptMethod(InvocationContext ctx) throws Exception {

        // Do some operations and side effects on myIntegerField;

        try {
            Object result = ctx.proceed();
            return result;
        } catch (Exception e) {
            throw e;
        }
    }

    public List<Class<?>> getMyIntegerField() {
        return myIntegerField;
    }

}

其中 MyInterceptorBinding 是拦截器绑定:

@Inherited
@InterceptorBinding
@Target({TYPE, METHOD, PARAMETER, FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInterceptorBinding {}

我想像这样将我的拦截器注入 bean class:

@ApplicationScoped
public class MyBean implements Serializable {

    @Inject
    private MyInterceptor interceptor;

    public void aMethod(){
        int var = interceptor.getMyIntegerField();
        // use var in some way...
   }
}

但是这个注入带来了一个错误:

Unsatisfied dependencies for type MyInterceptor with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private trials.MyBean.interceptor

我该如何解决这个问题?问题是否与拦截器有关? 我应该使用 CDI 便携式扩展工具吗?如果是这样,怎么做到的?

您不能注入拦截器,因为它们不是 bean。您可能可以做的是创建一个辅助 bean 并将其注入拦截器和应用程序范围的 bean。那个 helper bean 可以包含这个值,拦截器可以设置它,另一个 bean 可以读取它。

有关范围的警告:您的 MyBean 是应用程序范围的,这意味着只有一次实例。如果在请求作用域的 bean 中使用拦截器,拦截器值应该是多少?为此,助手 bean 很可能也应该是应用程序范围的,并且您应该注意线程安全。