【问题标题】:Failed to build quarkus application: Unsatisfied dependency for type无法构建 quarkus 应用程序:不满足类型的依赖关系
【发布时间】:2020-11-19 16:46:59
【问题描述】:

我正在尝试将一个小型企业(多模块)RESTEasy JAX-RS 应用程序移植到 Quarkus,但我遇到了以下错误。我无法控制对公司模块的许多依赖,但我尝试遵循 Quarkus 的上下文和依赖注入指南 (https://quarkus.io/guides/cdi-reference)。

操作系统:Ubuntu 18.04 (WSL)

Java:OpenJDK 11.0.8

命令:./mvnw clean install -DskipTests

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.9.2.Final:build (default) on project <REDACTED>: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]         [error]: Build step io.quarkus.arc.deployment.ArcProcessor#validate threw an exception: javax.enterprise.inject.spi.DeploymentException: Found 4 deployment problems:
...
[ERROR] [3] Unsatisfied dependency for type <REDACTED>.security.cryptography.CryptographyService and qualifiers [@Default]
[ERROR]         - java member: <REDACTED>.request.handlers.ConfigurationFileDownloadHandler#cryptographyService
[ERROR]         - declared on CLASS bean [types=[<REDACTED>.request.handlers.ConfigurationFileDownloadHandler, java.lang.Object], qualifiers=[@Default, @Any], target=<REDACTED>.request.handlers.ConfigurationFileDownloadHandler]

代码本身的DI:

...
import <REDACTED>.security.cryptography.CryptographyService;
...

@ApplicationScoped
public class ConfigurationFileDownloadHandler {

...

    @Inject
    private CryptographyService cryptographyService;
...

在子模块 pom 文件中声明了依赖项(从下面的mvn dependency:tree 可见):

[INFO] +- <REDACTED>.security.cryptography:cryptography-service-api-jar:jar:1.5.1:compile

我还在&lt;sub-module/src/main/resources下创建了一个application.properties文件,内容如下:

quarkus.index-dependency.cryptography.group-id=<REDACTED>.security.cryptography
quarkus.index-dependency.cryptography.artifact-id=cryptography-service-api-jar

在``beans.xml文件。

我是否认为这些第三方公司类没有正确的注释以供 Quarkus CDI 流程发现?

任何帮助表示赞赏。

【问题讨论】:

    标签: java quarkus


    【解决方案1】:

    我是否认为这些第三方公司类没有正确的注释以供 Quarkus CDI 流程发现?

    是的,这应该是问题所在,如果 CryptographyService 中不存在 CDI 注释,即使它已被 Jandex 索引,它也不会被注入。

    解决方案是创建一个生产者在 bean 工厂内生产一个 CryptographyService bean。

    类似这样的:

    @Singleton
    public class CryptographyServiceProducer {
        @Produces
        @ApplicationScoped
        public CryptographyService cryptographyService() {
            return new CryptographyService();
        }
    }
    

    作为参考,这里有一些关于 CDI bean 生产者的文档:https://quarkus.io/guides/cdi#q-ok-you-said-that-there-are-several-kinds-of-beans

    【讨论】:

    • 感谢@loicmathieu,非常有用的建议。我使用您建议的代码(当然还有导入)创建了我的新CryptographyServiceProducer 类,但我没有看到return new CryptographyService(); 行上的错误Cannot instantiate the type CryptographyServiceJava(16777373) 似乎是一个非常基本的问题,但不知道如何解决它。
    • 好的,问题可能是 CryptographyService() 是一个抽象类,无法实例化 - stackoverflow.com/questions/15157462/…。我必须检查我是否可以访问该源代码以验证是否确实如此。
    • 所以CryptographyService 不是一个抽象类,而是一个接口,这是一样的区别,因为它不能被实例化。我还在另一个模块中找到了实现 - public class CryptographyServiceBean implements CryptographyService - 我可以实例化它吗?
    • @EmilDimitrov 您的问题现在似乎与 Java 相关,而不是 Quarkus 相关,因为您的 CryptographyService 来自您的一个库,我现在知道如何为您提供帮助。
    • 非常感谢@loicmathieu 的帮助,你说得对,我会自己解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2021-04-15
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多