64

从我在网上可以找到的信息来看,Guice + Jersey 整合的最新技术自 2008 年以来一直停滞不前,当时两支球队似乎都陷入了僵局。问题的症结在于 JAX-RS 注释执行字段和方法注入,这与 Guice 自己的依赖注入不能很好地配合。

我发现的几个例子还不足以说明:

  • Iqbalyusuf在 Google App Engine Java 上的 Jersey + Guice 上的帖子受到大量样板文件的影响(手动获取和调用注入器)。我希望绑定和注入应该通过 Guice 注释在幕后进行。

  • Jonathan Curran 的文章使用 Jersey、Guice 和 JSR-250 创建一个 RESTful 服务给了我希望,因为它更新的更多(2010 年),但仅仅展示了如何在 Guice ServletModule 中启动 Jersey 服务。但是,没有任何真正的依赖注入的例子。我想这留给读者作为练习。Curran 的帖子实际上可能是连接 Guice 和 Jersey 的正确第一步,所以我计划从那开始。

  • 诱人的詹姆斯斯特拉坎写道

    JAX-RS 与 Spring、Guice、GuiceyFruit 或 JBossMC 等依赖注入框架配合得很好——你基本上可以选择你喜欢的任何一个。

    但是从从业者的角度来看,我没有看到任何证据是真实的。

我发现缺少的是关于如何结合 JAX-RS 和 Guice 注释的实际示例和解释。例如:

  • 我相信我不能对任何资源使用构造函数注入,因为 Jersey 想要控制它
  • 我不确定是否可以将@Inject 与@PathParam、@QueryParam 等结合使用。
  • 如何在 MessageBodyWriter 实现中使用注入

有没有人有例子,最好是有来源,结合泽西岛和吉斯而不牺牲其中一个或另一个的非平凡应用程序?不管怎样,我都会继续走这条路,但泽西和吉斯名单上的点点滴滴让我觉得我在重复其他人的工作。

4

11 回答 11

52

Guice 与泽西岛的整合并没有停滞不前。反之亦然。感谢 Paul 和他在 Jersey 背后的团队,最新的 1.7 版本包含一个特殊的 JerseyServletModule 类,可以与基于 Guice 的 servlet 一起使用。基于 Guice 的构造函数注入 JAX-RS 资源有效!问题是在 JAX-RS 资源的构造函数中使用了 JAX-RS 注释,例如 @QueryParam。你不需要它!您一直使用 Guice 进行 POJO 注入,包括单例。那么 JAX-RS 只是为解析基于 HTTP 的 RESTful API(如 URL 路径、查询参数、内容类型等)锦上添花。您也不需要“工业实力”示例。Guice 和 Jersey 都经过了实战考验。您只需要一个完整的工作示例来了解它是如何工作的。然后,您可以自行试验高级功能。查看以下链接以获取使用 Guice 3.0 和 Jersey 1.7 的完整示例,它们都是最新版本:
http ://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html

于 2011-05-30T05:09:27.963 回答
20

我在这里创建了一个 Guice/Jersey/Jetty/Jackson 示例应用程序:

http://github.com/sunnygleason/j4-minimal

如果您对如何改进示例有任何问题或建议,请随时通过 github 给我发消息。目标是使这成为对 Java 堆栈上 REST 的非常易于理解的介绍。

希望这会有所帮助 - 祝您有美好的一天!

-晴天

于 2010-07-21T05:13:56.263 回答
9

受 Sunnys 示例应用程序的启发,我创建了一个类似的示例项目,它使用标准 WAR 文件进行部署,例如在 Apache Tomcat 中。您可以在这里找到该项目:

https://github.com/danbim/template-guice-jersey-tomcat

玩得开心!丹尼尔

于 2010-12-20T13:47:36.887 回答
3

我相信我不能对任何资源使用构造函数注入,因为 Jersey 想要控制它

您不能使用 guice 的构造函数注入,因为资源的创建是由 jersey 管理的。@Inject在这种情况下,您可以在要注入的构造函数参数之前使用球衣的注释:

public NewsResource(@Inject NewsService service)
于 2010-04-21T13:04:31.020 回答
3

我最初尝试使用 Guice 在我的 Jersey 注释类上进行构造函数注入时遇到了类似的问题,但最终让它工作,尽管应用程序相当简单。

我按照这里的说明进行操作:jersey-guice javadoc

在我的案例中,诀窍是我需要从我的 web.xml 中删除标准 Jersey 配置(如 Jersey ServletContainer),并且只保留 Guice 侦听器和 Guice 过滤器。一旦我这样做了,就会调用 Guice 来创建我的 JAX-RS 注释对象,并且 Jersey 会按预期注入我的 JAX-RS 注释方法(如 @GET 等)。

于 2010-11-18T22:28:33.590 回答
3

虽然 Sunny Gleason 的例子很棒,但现在有点过时了。

所以,在今天为了让 Guice 和 Jersey 能很好地相处而苦苦挣扎之后,我创建了以下示例项目来帮助您入门:

https://github.com/MaliciousMustard/gradle-guice-jersey-jetty

该项目使用以下技术:

  1. DI指南
  2. 用于 RESTful API 的 Jersey
  3. 杰克逊 POJO 到 JSON 的映射
  4. 用于 Web 服务器的 Jetty
  5. 摇篮

我想最重要的是您不必明确指定要添加的每个新资源类。只要您将它们添加到正在扫描的包中(查看malicious.mustard.modules.JerseyModule),它们就会被自动找到!

于 2016-02-29T00:05:49.733 回答
2

GWizard包含一个模块,可让您在 Jersey2 和 Guice 之间进行开箱即用的集成。下面是一个完整的 JAX-RS 服务示例:

public class Main {
    @Path("/hello")
    public static class HelloResource {
        @GET
        public String hello() {
            return "hello, world";
        }
    }

    public static class MyModule extends AbstractModule {
        @Override
        protected void configure() {
            bind(HelloResource.class);
        }
    }

    public static void main(String[] args) throws Exception {
        Guice.createInjector(new MyModule(), new JerseyModule()).getInstance(Run.class).start();
    }
}

请注意,这是基于Squarespace jersey2-guice 适配器,它可能无法在 Jersey 的未来版本中正常运行。GWizard 还提供了一个首选的 RESTEasy JAX-RS 模块。

这是一个可能有帮助的博客条目:http: //blon.com/post/107397841765/guice-and-jersey-2-the-easy-way

于 2015-01-07T10:31:23.723 回答
1

Jersey-Guice 插件 Javadoc 提供了很好的描述:

http://jersey.java.net/nonav/apidocs/1.1.5/contribs/jersey-guice/com/sun/jersey/guice/spi/container/servlet/package-summary.html

于 2012-03-08T05:20:36.157 回答
1

这些示例对我来说都是很好的开始,但我想要一个完整的 MVC 堆栈,使用 Jersey-Guice 作为其核心。一段时间以来,我一直在努力改进它。截至本周,该 MVC 堆栈已作为原型完全部署到 Maven 中央存储库。这意味着您现在可以使用一个 Maven 命令创建一个新的 Jersey-Guice 堆栈:

mvn archetype:generate \
    -DarchetypeGroupId=org.duelengine \
    -DarchetypeArtifactId=duel-mvc-archetype \
    -DarchetypeVersion=0.2.1

这会使用您指定的包命名自动生成您自己的项目,因此您不必手动编辑模板项目。

有关详细信息,请参阅项目Readme.md:https://bitbucket.org/mckamey/duel-mvc

我使用的双面视图(客户端模板和服务器端视图)的详细信息在这里:https ://bitbucket.org/mckamey/duel但你可以用你使用的任何东西替换。

于 2011-07-23T16:50:40.767 回答
0

我发现了一个有趣的轻量级 Jetty+Guice+Jackson Web 服务项目:https ://github.com/talis/jersey-common/

于 2012-03-10T12:27:04.500 回答
0

我创建了一个 Guice 4.2、Jetty 9.4 和 Jersey 2.7 示例应用程序:

https://github.com/bnsd55/jetty-jersey-guice-starter-kit

正如桑尼所说:

如果您对如何改进示例有任何问题或建议,请随时通过 github 给我发消息。目标是使这成为对 Java 堆栈上 REST 的非常易于理解的介绍。

于 2018-09-25T05:26:02.857 回答