使用@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
.
我正在使用一个非线程安全的库,并且我希望在每次使用该库对象时都有一个新的实例。我在这里做了一个测试回购: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
:
@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
.