在Quarkus CDI中使用无状态bean



我有一个包含带@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用@Dependent之类的东西替换@Statless注释。但我不明白的是,我怎么能积极地做到这一点,而且没有任何例子可以提示我正确的方向。

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

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

也许有人能给我指点一下正确的方向,告诉我如何实现这样的目标。

哇,这太简单了。@Ladicek的答案是理解这个问题的最后推动力。

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

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

部署依赖于运行时,而您的项目必须依赖于运行时。我不明白您究竟如何从部署项目中的类中获益。

deployment -> runtime <- your project

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