【问题标题】:Is there a way to cause Guice to preserve annotations?有没有办法让 Guice 保留注释?
【发布时间】:2019-04-02 16:18:01
【问题描述】:

我正在尝试遍历由接口 Bar 注释的所有类,使用 Guice 的 Injector.createInstance 对其进行初始化,并将它们注册到 Dropwizard Jersey 服务器。

但是,Guice 的Injector.createInstance 方法似乎放弃了 JAX-RS 以及每个类上的自定义注释。出于某种原因,Guice 唯一保留的就是 @MediaType 注释。 @Path 注解丢失,导致 Jersey 无法正确处理 HTTP 请求。

有没有办法强制 Guice 在自己生成的实现中保留这些类上的所有现有注释?请注意,注入器未配置为专门处理Foo 的实例,但Foo 的构造函数被标记为注入。

【问题讨论】:

    标签: java annotations jax-rs guice


    【解决方案1】:

    Guice doesn't support this (yet)

    Guice 的 open issue on this topic 已有 10 多年了,但仍未解决,而且可能永远也不会解决。

    唯一的解决方法是在注释上使用@Inherited 注释。

    但是你提到你使用现有的注释,而不是自定义的,所以让我们检查一下:@Consumes@Inherited(太棒了!),@Produces 也是如此(也太棒了!),但 @Path 不是t(嘘!),所以您的 Guice 代理上确实不存在 @Path

    我能给你的唯一建议是摆脱你的 Guice-AOP (TypeListener)。如果你能做到这一点,那么你很可能不会有任何 Guice 代理,并且你的方法将位于顶部对象上,因此对 Jersey 可见。

    【讨论】:

    • 我接受这个答案是因为它回答了我提出的问题。然而,令人惊讶的是,这个问题根本不是由注入库引起的。使用手动构造的对象时,我仍然面临它。也许更令人惊讶的是,Guice 的代理仍然能够在其他项目以及我自己的项目中与 Jersey 合作(所需路径上的错误消息不是 404,这意味着 Jersey 能够从代理“读取”正确的路径对象)。
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多