当前位置: 首页 > 知识库问答 >
问题:

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

公良光熙
2023-03-14

我有一个简单的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.不满意的解决方案异常。但是,如果我在RosterService上使用@Application ationScoped注释,那么一切都很好。是否有一种方法可以在不使用注释的情况下将RosterService类注入到我的资源中?换句话说,是否有一种方法可以使Quakus容器可以发现RosterService而不直接注释该类?

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

另一个选择是使用Jandex索引

共有2个答案

羊舌兴德
2023-03-14

您不想用@ApplicationScoped(或任何其他bean discover/scope注释)注释服务类,有什么具体原因吗?

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

洪高扬
2023-03-14

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

编辑:关于Jandex索引,它允许您在其他罐子中扫描bean。换句话说,它只会扩展被扫描的一组类,以获得定义bean的注释。

当涉及@BuildStep方法时——这仅在Quarkus扩展中可能。扩展功能强大(实际上它们可以定义额外的bean),但也很复杂。你可以从https://quarkus.io/guides/building-my-first-extension,但这可能会让人感到难以承受。如果你想把你的类变成一个bean,你可能会觉得这样做是不对的——这是真的。但是,如果您的类来自无法更改的外部库,那么扩展是有意义的。

 类似资料:
  • 问题内容: 我正在使用@cacheable注解缓存函数的结果。我有3个不同的缓存,每个缓存的关键是当前登录的用户的用户ID,该用户ID与方法中的参数连接在一起。在某个事件中,我想逐出所有具有以该特定用户ID开头的键的缓存条目。例如 : 我希望缓存逐出注释为: 但是当我尝试实现这一点时,它给了我一个错误: 什么是实现此目的的正确方法? 问题答案: 每个操作所有Spring Cache批注(即,等)都

  • 问题内容: 如果我要使用DefaultServeMux(我将其指定为ListenAndServe的第二个参数来指定),那么我可以访问,您可以在Go Wiki的以下示例中看到该: 在当前代码中,我无法使用DefaultServeMux,即我将自定义处理程序传递给ListenAndServe 因此,我没有内置的代码。但是,我必须将一些授权代码修改为需要类似的授权代码。例如,如果我一直在使用Defaul

  • 我有一个具有两个属性的dynamoDB表: A: 主分区键 B: 主排序键 我想使用属性B查询这个表,因为我不知道A的值。可以这样做吗? 是否可以将B设为GSI(全局二级索引),如何使用B查询表,因为B已经是排序键。

  • 问题内容: 我有和。 我的Linux Mint 12上有很多错误,我只是重新安装了它,所以我想再次从头开始安装所有内容。 这是我的错误之一。我在那里收到一个有趣的答案: 停止使用su和sudo运行virtualenv。 你需要以普通用户身份运行virtualenv。 你已经使用sudo创建了virtualenv,这就是为什么你会收到这些错误的原因。 那么如何不使用安装呢?我可以使用还是不使用?还是

  • 我将guava jar文件添加到类路径中,但我的IDE(eclipse)说: Nullable无法解析为类型 但如果我ctrl+单击Nullable,我会看到蓝色下划线,然后看到下划线:

  • 我的基于spring Boot2.1的webflux应用程序(来自project reactor)使用了一个库(L),该库公开了一个封装在Resilience4j 1.1.0中的中(它没有使用诸如之类的注释)。 我很想在Spring actuator http管理控制台(例如在health endpoint)中展示这个断路器的指标。我已经添加了依赖项,但是当我加载健康页面时,我只看到以下内容: 即