当前位置: 首页 > 知识库问答 >
问题:

向bean中注入CDI拦截器不起作用

鲍钊
2023-03-14

我已经创建了一个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类,如下所示:

@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便携式扩展设施吗?如果是,如何解决?

共有1个答案

易嘉胜
2023-03-14

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

关于作用域的警告:您的MyBean是应用程序作用域,这意味着只有一个实例。如果拦截器用于请求范围的bean,那么拦截器值的值应该是什么?为了实现这一点,helper bean很可能也应该是应用程序范围的,并且您应该注意线程安全。

 类似资料:
  • 问题内容: 我试图在AngularJS中制作一个拦截器。我是AngularJS的新手,并找到了一些Interceptor的示例,但无法使其正常工作。 这里有我的app.js文件,其中包含所有相关代码。我还有一个控制器,该控制器调用REST api并返回JSONP。 首先,我声明模块,然后进行配置(定义拦截器)。现在它应该捕获所有请求并将其输出到控制台… 用app.factory创建拦截器是否错误?

  • 文件src/main/webapp/WEB-INF/web.xml包含用于引导CDI的servlet侦听器和BeanManager引用: 通过这些设置,在使用mvn Jetty运行应用程序时,我总是遇到以下错误:run(第一行是最重要的): 应用程序正在运行,但正如异常消息所述:CDI注入在servlet中不可用。 在src/main/resources/log4j.properties中,我增加

  • 我试图让CDI在tomcat 9.x中工作。我遵循了以下链接,但openwebbeans容器仍然没有将资源注入servlet https://devlearnings.wordpress.com/2011/05/15/apache-openwebbeans-cdi-from-standalone-to-webapp/https://dzone.com/articles/using-apache-o

  • 我想在注射过程中给CDI中的pojo bean一个移动范围。 我创建了一个普通的bean,并在托管Bean中注入了与相同的内容: //POJO类 当我使用相同的语法注入时,Pojo bean的填充值无法在新视图bean中恢复。 但是当我在类声明中使用时,它会起作用,然后是非作用域注入,如下所示: 注射: 前一种情况在我做制片人和资格赛时得到了解决,但我觉得这将是一种我不应该做的开销。作为CDI的新

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 我根据JBoss文档创建了一个拦截器。 为了测试拦截器,我把: 现在,我想使用WeldJUnit4Runner类在单元测试中测试这个拦截器。 现在的预期产出当然是 但结果却是 主要问题是,如果我在测试中注入bean,这也是正确的:我调用的bean的第一个方法被拦截,但是如果这个方法调用另一个方法,拦截器就不会被调用。 任何想法都非常感谢! 我只是按照@adrobisch的建议修改了我的代码,效果如