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



我有一个简单的夸克资源:

@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类在我的资源不使用注释?换句话说,有没有一种方法可以使RosterService不直接注释类而被Quarkus容器发现?

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

另一个选择是使用Jandex索引

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

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

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

是否存在不想使用@ApplicationScoped(或任何其他bean发现/作用域注释)注释服务类的特定原因?

我所知道的唯一另一种方法(而不是注释)是-正如你自己提到的-使用Jandex索引。

最新更新