如何在不使用注释的情况下让 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.
我有一个简单的 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.