当前位置: 首页 > 知识库问答 >
问题:

带有非QuarkusSpring罐的CDI

郜联
2023-03-14

我们正在尝试将应用程序从Spring迁移到Quarkus Spring。我们可以根据需要重新编写应用程序逻辑。问题来了,因为我们正在使用共享的spring罐,这是传统的,而且数量很多。大多数spring JAR都使用@Autowired使用依赖项注入,但被注入的相应类没有@Component注释。

将用示例描述问题:

类“MyProject”属于Quarkus应用程序

public class MyProject {
    
    @Autowired
    private OtherLevelOne otherLevelOne;

    public void invokeMe() {
        this.otherLevelOne.call();
    }
}

类OtherLevelOne和OtherLevelTwo属于依赖项spring jar。

public class OtherLevelOne {
    
    @Autowired
    private OtherLevelTwo otherLevelTwo;

    

public void call() {
        this.otherLevelTwo.otherCall();
    }
}

public class OtherLevelTwo {
    
    public void otherCall() {
        
    }
}

面临的问题。

During compilation of Quakrus Application we get error:
[ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:2.1.3.Final:build (quarkus-app-build) on project service-quarkus: 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 2 deployment problems:
[ERROR] [1] Unsatisfied dependency for type OtherLevelOne and qualifiers [@Default]

尝试过的事情:为OtherLevelOne和OtherLevelTwo添加了一个生产者类。这有助于解决编译时不满意的依赖性问题,构建成功了。但现在,当OtherLevelOne的方法“调用”试图访问“OtherLevelTwo”的实例时,我们在运行时遇到了一个NullPointException。看来二级注射没有发生。Quarkus可能不支持这一点(没有一些修改,比如向依赖项JAR中的所有类添加beans.xml和@Component注释)。

@Dependent
public class ProducerClass {

    @Produces
    public OtherLevelOne createOtherLevelOne() {
        return new OtherLevelOne();
    }

    @Produces
    public OtherLevelTwo createOtherLevelTwo(){
        return new OtherLevelTwo();
    }
}

问题

  1. 有没有一种方法可以让QUOKUS在这种情况下工作,而不需要编译与QUOKUS的所有依赖关系?
  2. 是否有可能编写一个QUUKUS扩展,以帮助实现所需类型的依赖注入?

谢谢

共有1个答案

东方夕
2023-03-14

在quarkus中,不支持通过XML进行配置,因此您需要创建一个生产者方法来生成OtherLevelOneOtherLevelTwobean

 类似资料:
  • 我制作了自己的包装类,我希望那些使用我编译的JAR文件的人都能使用这些包装类。 这个jar文件还包含一个lib文件夹,它还有bouncy castle库,因为包装器的目的是让调用者更容易。现在我的库(名为mylibrary.jar)已经构建完成。 现在,当我将这个jar作为库包含在另一个项目中时,我看到以下错误 线程“AWT-EventQueue-0”java.lang.NoClassDefoun

  • 我一直以这篇文章为例。我有一个复杂的连接查询(这里简化了)。它返回来自两个表(以及使用CASE的派生列)的值的子集。我认为我不需要使用实体注释,因为从结果集中返回的对象不是模式中的实际表。 我希望保存连接查询结果的非实体对象: 我的回购: 我的服务: 我不确定如何让我的存储库查看我的新CarLimitDelta.getCarLimitDelta本机查询方法在我的NameNativeQuery中定义

  • 上一个dev在代码中留下了一个非常奇怪的yoda条件: 经过一些测试,我发现与。 是总是等同于? 要分解条件,是还是?还是前者永远等同于后者?

  • 我们面临的最大问题是,我们无法找出如何构造项目C,以使其在项目A和B中都能正常工作。在项目A中,我们希望maven能像往常一样工作,并根据需要降低依赖项。但我们也希望在项目B(也许结合Nexus+Tycho??)中实现该功能。 我们应该如何解决这个问题。我还没有找到一个好的解决办法如何做这件事。我已经在maven中尝试了apache felix捆绑插件,但不能让它像我想要的那样工作。这是正确的解决

  • 我正在处理一个包含多个子项目的项目,它们都使用我创建的用于哈希、签名和加密消息的实用程序库。这个库基本上是bouncy Castle的包装器。 当我运行与库相关联的测试时,一切都通过了,一切都好了。当我将实用程序库打包到jar中时,会发生两件事: 正在使用库的子项目找不到与bouncy Castle关联的JAR。 即使将bouncy castle JAR添加到正在使用库的子项目中,项目也找不到bo

  • 我正在学习新Java8中的lambdas。有一件事很有趣。如果方法具有与函数接口相同的签名,则可以使用lambdas API将其分配给方法。例如。 这个方法(integer.compare)是静态的,取两个值,一切都很完美。签名与接口方法比较中的签名相同。但这可以用非静态方法来实现,例如 这个方法是非静态的(实例级别),而且它只需要一个值。正如我所理解的,在Java中没有非静态方法,每个方法都是静