java - 在 Quarkus 中使用 @Inject 和接口(interface)进行依赖注入(inject)

标签 java spring cdi quarkus

我正在尝试使用 Quarkus 1.6.1.Final 和 OpenJDK 11 使用存储库模式解决依赖注入(inject)。
我想用接口(interface)实现注入(inject)并给他们一些参数(如 @Named@Qualifier )以指定具体类,但目前我有 UnsatisfiedResolutionException并且不知道如何解决它。
这是我的代码部分。
用例类:

@ApplicationScoped
public class ProductStockCheckUseCase {
    @Inject
    @Named("dummy")
    ProductStockRepository repo;

    public int checkProductStock() {
        ProductStock stock = repo.findBy("");
        return stock.getCount();
    }
}
存储库接口(interface):
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]
你有任何想法如何解决这个问题吗?还是实现这种接口(interface)注入(inject)并使用参数/注释指定具体类是错误的想法?
我已阅读并尝试过以下文章:
一些官方文档:
  • Quarkus - 上下文和依赖注入(inject) https://quarkus.io/guides/cdi-reference
  • JSR 365:Java 2.0 的上下文和依赖注入(inject) https://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#default_bean_discovery
  • CDI 和 EJB 3.1 的按需接口(interface)https://www.oracle.com/technical-resources/articles/java/intondemand.html
  • 23.7 注入(inject) Bean - Java 平台,企业版:Java EE 教程(第 7 版)https://docs.oracle.com/javaee/7/tutorial/cdi-basic007.htm

  • 其他博客和 SO:
  • java - 如何注入(inject) JpaRepository 的实现 - 代码日志how inject implementation of JpaRepository
  • java - 如何注入(inject)实现相同接口(interface)的两个不同类的两个实例? - 堆栈溢出 How to inject two instances of two different classes which implement the same interface?
  • Java EE 上下文和依赖注入(inject)@Qualifier https://memorynotfound.com/context-dependency-injection-qualifier/
  • 最佳答案

    我的猜测是您需要在 ProductStockDummyRepository 中添加范围注释。 .可能是 @Singleton@ApplicationScoped .

    关于java - 在 Quarkus 中使用 @Inject 和接口(interface)进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63412802/

    相关文章:

    java - 如何避免为未实现公共(public)接口(interface)的相同库方法编写许多包装器?

    java - android 和 java 中的 SQLite 数据库

    java - Java中使用 json-simple 将List转换为JsonObject

    java - 如何在 Spring Integration 中实现这个 TCP 流读取器?

    java - Spring Tool Suite 4 (JAVA) 上的 "Web Service Client (CXF 2.)"问题

    spring - 如何在执行许多异步后台任务时保持网络服务器响应

    java - Spring Context 是否具有相当于 Java CDI 的 @Inject @Any

    java - 替换 IBM MQ 消息有效负载并使用 Java 中的相同消息进行回复(不带 JMS)

    java - Spring InitializingBean 不适用于 CDI

    java - 在不同的包中为同一类使用两个 CDI 生成器 (Intellij)