在 Quarkus CDI 中使用无状态 Bean

问题描述 投票:0回答:1

我有一个库,其中包含用@Stateless 注释的服务,我无法修改。例如这样的事情:

@Stateless
@Local(MyServiceLocal.class)
@Remote(MyServiceRemote.class)
public class MyServiceBean implements MyServiceLocal

现在我想在我的 quarkus 应用程序中使用这些服务,就像这样简单:

@QuarkusMain
public class MyMain implements QuarkusApplication {
    
    @Inject
    MyServiceLocal myService;

    @Override
    public int run(String... args) {
        myService.doSomething();
    }
}

...但是因为它们没有 bean 定义注释,而且我无法添加一些,所以它们没有被注入。

根据我的简单理解,我可以使用 quarkus AnnotationsTransformer 将 @Statless 注释替换为 @Dependent 之类的注释。 但我不明白的是,我如何才能积极地实现这一目标,而且没有任何例子可以提示我朝着正确的方向前进。

我有一个 AnnotationsTransformer,它可以很好地做到这一点,但我如何将它应用到我的应用程序中?我收集到的是,我需要一个 quarkus 扩展,在我的部署子项目中使用 AnnotationsTransformer。但是我的运行时子项目的内容是什么?我不需要扩展中的转换注释,但在我的 quarkus 应用程序中。

因为我的理解是我不能直接在我的 quarkus 应用程序中使用 BuildSteps,所以我被卡住了。

也许有人可以在正确的方向上提示我如何实现这样的目标。

java gradle annotations javabeans quarkus
1个回答
0
投票

哇,这出奇的简单。 @Ladicek 的回答是理解问题的最后推动力。

我现在有一个带有空运行时子项目的简单 quarkus 扩展,以及包含单个类的部署子项目:

@BuildStep
AutoAddScopeBuildItem autoAddScope() {
    return AutoAddScopeBuildItem.builder().containsAnnotations(DotName.createSimple("javax.ejb.Stateless"))
            .defaultScope(BuiltinScope.DEPENDENT)
            .build();
}

部署对运行时有依赖,你的项目也得对运行时有依赖。我不明白你到底怎么可能从你的部署项目中的类中受益。

deployment -> runtime <- your project

但是由于在您的运行时扩展描述中引用了部署项目,因此它将在构建时加载。

© www.soinside.com 2019 - 2024. All rights reserved.