java - 注释由生产者注入(inject)的变量

标签 java dependency-injection annotations cdi

根据我的理解,应该可以使用生产者通过 CDI 在 Java 中注入(inject)任何类型的变量。为了测试这一点,我创建了一个小型单元测试。

@RunWith(CdiRunner.class)
public class Test {

    @Inject
    @AnIntProducer
    int i; // Variable to be injected

    @org.junit.Test
    public void test() throws Exception {
        System.out.println(i);
    }
}

然后我继续创建注释和生成器:

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface AnIntProducer {
}

public class TestProducer {

    @Produces
    @AnIntProducer
    public int i() {
        return 503;
    }
}

当我运行测试时,我认为它应该打印 503,但我得到的是:

org.jboss.weld.exceptions.DeploymentException:
WELD-001408: Unsatisfied dependencies for type int with qualifiers @AnIntProducer
  at injection point [UnbackedAnnotatedField] @Inject Test.i
  at Test.i(Test.java:0)  

不知何故,CdiRunner 似乎找不到制作人,我真的不知道为什么。我的设置有问题还是我只是误解了注入(inject)的工作原理?

最佳答案

CdiRunner 检查测试类的导入并根据引用的类构建迷你部署。当您运行测试时,您定义的生产者不包含在该小型部署中。

要在测试部署中包含其他类和包,您需要将 @AdditionalClasses 或 @AdditionalPackages 添加到测试类中。

示例:

@RunWith(CdiRunner.class)
@AdditionalClasses(TestProducer.class)
public class Test {

您还可以使用注释来声明测试部署的 beans.xml 中应包含的内容,以便您可以通过这种方式激活替代方案、拦截器和装饰器。

关于java - 注释由生产者注入(inject)的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33633210/

相关文章:

java - 如何从自定义子注释中获取值?

java - 线性布局中的按钮垂直而不是水平显示?

java - 在 Android 上使用哪个 SVM 库?

Java 和注入(inject)防御副本

javascript - 为什么 Angular 不允许我将参数传递给提供者的 useFactory 中的函数?

java - 在 BeanPostProcessor 实现中获取 bean 的注解

java - java中的哈希码桶分布

java - SWT : how to make rounded border label

dependency-injection - 如何在多项目解决方案中使用 .net 核心依赖注入(inject)?

python - 是否有内置方法从 Python 的所有基类中获取所有 __annotations__?