使用@Dependent 时无法在 quarkus 中注入动态实例

Cannot have inject dynamic instance in quarkus when using @Dependent

我正在使用一个非线程安全的库,并且我希望在每次使用该库对象时都有一个新的实例。我在这里做了一个测试回购:https://github.com/lud/test-quarkus-arc

库自带两个class,我需要用到的SomeLibraryClass,前者需要的SomeLibraryClassDependency,这是线程不安全的.

我试图通过使用这个工厂风格来让所有这些工作正常进行 class:

@ApplicationScoped
public class MyAppFactory {
  @Dependent
  @Produces
  SomeLibraryClassDependency getDep() {
    return new SomeLibraryClassDependency();
  }

  @Dependent
  @Produces
  SomeLibraryClass getUsable(SomeLibraryClassDependency dep) {
    return new SomeLibraryClass(dep);
  }

  @Inject
  Instance<MyAppClass> myClass;

  public MyAppClass getNewMyClass() {
    return myClass.get();                // <-- this fails
  }
}

这是我要编译的一些测试代码。我调用工厂 getter 两次,我验证我的 class 使用 SomeLibraryClassDependency class.

的不同实例
@Test
public void testHelloEndpoint() {
  var a = factory.getNewMyClass();
  var b = factory.getNewMyClass();
  assertNotEquals(a.getUsabeId(), b.getUsabeId());
}

这是应该通过调用 Instance<MyAppClass>#get:

实例化的 class
@Dependent
public class MyAppClass {
  @Inject
  SomeLibraryClass usable;

  public MyAppClass() {

  }

  public Integer getUsabeId() {
    return usable.getId();
  }
}

最后是库模拟的代码:

public class SomeLibraryClass {

  private SomeLibraryClassDependency dep;

  public SomeLibraryClass(SomeLibraryClassDependency dep) {
    this.dep = dep;
  }

  public Integer getId() {
    return dep.getId();
  }
}


public class SomeLibraryClassDependency {

  private static Integer n = 0;
  private Integer id;

  public SomeLibraryClassDependency() {
    n += 1;
    this.id = n;
  }

  public Integer getId() {
    return id;
  }
}

尝试编译时,出现以下错误,我不明白为什么

[error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type io.quarkus.arc.runtime.BeanContainer$Instance<org.acme.getting.started.MyAppClass> and qualifiers [@Default]

  • java member: org.acme.getting.started.MyAppFactory#myClass
  • declared on CLASS bean [types=[org.acme.getting.started.MyAppFactory, java.lang.Object], qualifiers=[@Default, @Any], target=org.acme.getting.started.MyAppFactory]

我在想既然MyAppClass@Dependent注解,应该解决了

编辑:我知道我也可以为我的 class 定义一个生产者,但我的最终目标是能够在那个 class 中 @Inject 其他东西(比如记录器)并让容器完成它的工作。

错误消息显示 Unsatisfied dependency for type io.quarkus.arc.runtime.BeanContainer$Instance<org.acme.getting.started.MyAppClass>,这表明您对 Instance class 的导入有误。正确的是 javax.enterprise.inject.Instance.