在 Quarkus 中使用 @Inject 和 Interface 进行依赖注入
Dependency injection with @Inject and Interface in Quarkus
我正在尝试使用 Quarkus 1.6.1.Final 和 OpenJDK 11 解决存储库模式的依赖注入问题。
我想实现 Inject with Interface 并给他们一些参数(比如 @Named
或 @Qualifier
)来指定具体的 class,但目前我有 UnsatisfiedResolutionException
并且不确定如何修复它。
这是我的代码部分。
用例class:
@ApplicationScoped
public class ProductStockCheckUseCase {
@Inject
@Named("dummy")
ProductStockRepository repo;
public int checkProductStock() {
ProductStock stock = repo.findBy("");
return stock.getCount();
}
}
存储库接口:
public interface ProductStockRepository {
public ProductStock findBy(String productId);
}
存储库实现:
@Named("dummy")
public class ProductStockDummyRepository implements ProductStockRepository {
public ProductStock findBy(final String productId) {
final ProductStock productStock = new ProductStock();
return productStock;
}
}
这是我的 build.gradle 的一部分依赖项:
dependencies {
implementation 'io.quarkus:quarkus-resteasy'
implementation 'io.quarkus:quarkus-arc'
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
testImplementation 'io.quarkus:quarkus-junit5'
testImplementation 'io.rest-assured:rest-assured'
}
当我 运行 这个(例如 ./gradlew assemble
或 ./gradlew quarkusDev
)时,我遇到了以下错误:
Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type ProductStockRepository and qualifiers [@Named(value = "dummy")]
- java member: ProductStockCheckUseCase#repo
- declared on CLASS bean [types=[ProductStockCheckUseCase, java.lang.Object], qualifiers=[@Default, @Any], target=ProductStockCheckUseCase]
您知道如何解决这个问题吗?或者实现这种接口注入并用 argument/annotation 指定具体的 class 是错误的想法?
我已阅读并尝试过以下文章:
部分官方文档:
- Quarkus - 上下文和依赖注入 https://quarkus.io/guides/cdi-reference
- JSR 365:Java 2.0 https://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#default_bean_discovery
的上下文和依赖注入
- CDI 和 EJB 3.1 的按需接口 https://www.oracle.com/technical-resources/articles/java/intondemand.html
- 23.7 注入 Bean - Java 平台,企业版:Java EE 教程(第 7 版)https://docs.oracle.com/javaee/7/tutorial/cdi-basic007.htm
其他博客和 SO:
- java - 如何注入 JpaRepository 的实现 - 堆栈溢出
- java - 如何注入实现相同接口的两个不同 classes 的两个实例? - 堆栈溢出
- Java EE 上下文和依赖注入 @Qualifier https://memorynotfound.com/context-dependency-injection-qualifier/
我的猜测是您需要向 ProductStockDummyRepository
添加范围注释。可能 @Singleton
或 @ApplicationScoped
.
我正在尝试使用 Quarkus 1.6.1.Final 和 OpenJDK 11 解决存储库模式的依赖注入问题。
我想实现 Inject with Interface 并给他们一些参数(比如 @Named
或 @Qualifier
)来指定具体的 class,但目前我有 UnsatisfiedResolutionException
并且不确定如何修复它。
这是我的代码部分。
用例class:
@ApplicationScoped
public class ProductStockCheckUseCase {
@Inject
@Named("dummy")
ProductStockRepository repo;
public int checkProductStock() {
ProductStock stock = repo.findBy("");
return stock.getCount();
}
}
存储库接口:
public interface ProductStockRepository {
public ProductStock findBy(String productId);
}
存储库实现:
@Named("dummy")
public class ProductStockDummyRepository implements ProductStockRepository {
public ProductStock findBy(final String productId) {
final ProductStock productStock = new ProductStock();
return productStock;
}
}
这是我的 build.gradle 的一部分依赖项:
dependencies {
implementation 'io.quarkus:quarkus-resteasy'
implementation 'io.quarkus:quarkus-arc'
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
testImplementation 'io.quarkus:quarkus-junit5'
testImplementation 'io.rest-assured:rest-assured'
}
当我 运行 这个(例如 ./gradlew assemble
或 ./gradlew quarkusDev
)时,我遇到了以下错误:
Caused by: javax.enterprise.inject.UnsatisfiedResolutionException: Unsatisfied dependency for type ProductStockRepository and qualifiers [@Named(value = "dummy")]
- java member: ProductStockCheckUseCase#repo
- declared on CLASS bean [types=[ProductStockCheckUseCase, java.lang.Object], qualifiers=[@Default, @Any], target=ProductStockCheckUseCase]
您知道如何解决这个问题吗?或者实现这种接口注入并用 argument/annotation 指定具体的 class 是错误的想法?
我已阅读并尝试过以下文章:
部分官方文档:
- Quarkus - 上下文和依赖注入 https://quarkus.io/guides/cdi-reference
- JSR 365:Java 2.0 https://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#default_bean_discovery 的上下文和依赖注入
- CDI 和 EJB 3.1 的按需接口 https://www.oracle.com/technical-resources/articles/java/intondemand.html
- 23.7 注入 Bean - Java 平台,企业版:Java EE 教程(第 7 版)https://docs.oracle.com/javaee/7/tutorial/cdi-basic007.htm
其他博客和 SO:
- java - 如何注入 JpaRepository 的实现 - 堆栈溢出
- java - 如何注入实现相同接口的两个不同 classes 的两个实例? - 堆栈溢出
- Java EE 上下文和依赖注入 @Qualifier https://memorynotfound.com/context-dependency-injection-qualifier/
我的猜测是您需要向 ProductStockDummyRepository
添加范围注释。可能 @Singleton
或 @ApplicationScoped
.