0

我有一个简单的 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. 但是,如果我在@ApplicationScoped上使用注释RosterService,那么一切正常。有没有办法在我的资源中注入RosterService类而不使用注释?换句话说,有没有办法让RosterServiceQuarkus 容器可以发现而不直接注释类?

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

另一种选择是使用Jandex 索引

4

2 回答 2

1

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

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

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

于 2021-09-26T21:54:50.393 回答
0

是否有您不想使用@ApplicationScoped(或任何其他 bean 发现/范围注释)注释服务类的特定原因?

我知道的唯一其他方式(而不是注释)是 - 正如你自己提到的 - 使用Jandex index

于 2021-09-27T11:28:29.343 回答