如何在不使用注释的情况下让 Quarkus CDI 发现 bean

How to make a bean discoverable by Quarkus CDI without using annotations

我有一个简单的 Quarkus 资源:

  @Path("/rosters")
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public class RosterResource {

    private final RosterService rosterService;
    public RosterResource(RosterService rosterService){
        this.rosterService = rosterService;
    }

    @GET
    @Path("/{rosterId}")
    public Response getRoster(@PathParam("rosterId")Long rosterId){
        return Response.ok(rosterService.getRosterById(rosterId)).build();
    }

}

我试图在我的资源中注入 RosterService 实例,但我得到的是 javax.enterprise.inject.UnsatisfiedResolutionException。但是,如果我在 RosterService 上使用 @ApplicationScoped 注释,那么一切正常。有没有办法在不使用注释的情况下在我的资源中注入 RosterService class?换句话说,有没有一种方法可以让 Quarkus 容器发现 RosterService 而无需直接注释 class?

编辑:查看CDI docs,您似乎可以使用带有@BuildStep 注释的方法手动注册bean。但是,我不清楚哪个 class 应该包含注释方法)

另一种选择是使用 Jandex index

据我所知,Quarkus 仅实现所谓的 annotated bean 发现。这意味着 Quarkus 中的所有 CDI bean 都必须有一个 bean 定义注释 @ApplicationScoped就是其中之一。

编辑:关于 Jandex 索引,它允许您扫描其他 JAR 中的 bean。换句话说,它只会扩展为 bean 定义注释扫描的 classes 集。

当谈到 @BuildStep 方法时——这只有在 Quarkus 扩展中才有可能。扩展很强大(实际上它们可以定义额外的 bean)但也很复杂。您可以从 https://quarkus.io/guides/building-my-first-extension 开始,但它可能会让人感觉不知所措。如果您只想让您的 class 成为一个豆子,您可能还会觉得这不是正确的做法——确实如此。但是,如果您的 class 来自您无法更改的外部库,则扩展是有意义的。

您不想使用 @ApplicationScoped(或任何其他 bean discover/scope 注释)注释您的服务 class 是否有特定原因?

我知道的唯一其他方法(而不是注释)是 - 正如您自己提到的那样 - 使用 Jandex index.