将 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 很可能也应该是应用程序范围的,并且您应该注意线程安全。
我创建了一个 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 很可能也应该是应用程序范围的,并且您应该注意线程安全。