我有一个简单的夸克资源:
@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索引。