关于使用Jersey和Guice进行RESTful服务的实用建议

too*_*ear 65 java jax-rs jersey guice jsr330

从我在网上看到的情况来看,Guice + Jersey整合的最新技术水平自2008年以来一直停滞不前,似乎两支球队都陷入了僵局.问题的关键在于JAX-RS注释执行字段和方法注入,这与Guice自己的依赖注入不能很好地协作.

我发现的一些例子远远不足以阐明:

  • Iqbalyusuf 在Google App Engine上发布关于Jersey + Guice的帖子Java遭受了大量的样板(手动获取和调用注入器).我希望绑定和注入应该通过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实现中使用注入

有没有人有一些非平凡的应用程序的例子,最好是源代码,它结合了Jersey和Guice,而不会在这个过程中牺牲一个或另一个?无论如何我都会坚持这条道路,但泽西和吉斯的名单上的点点滴滴让我觉得我正在重复在我面前的其他人的工作.

小智 53

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

  • 对于刚刚登陆的人来说,Guice注入JAX-RS资源*不适用于Jersey 2.x*.Upvote [this](https://java.net/jira/browse/JERSEY-1950)问题,如果你想看到它(已经是最受欢迎的泽西岛问题). (3认同)

小智 21

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

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

如果您对如何改进示例有任何疑问或建议,请随时通过github给我发消息.目标是使其成为Java堆栈上REST的非常容易获得的介绍.

希望这有帮助 - 祝你有个美好的一天!

-Sunny

  • 这个例子很棒,并且让我99%的方式,但从我能说的它实际上并没有最终使用杰克逊.如果您最终尝试使用jackson注释来执行隐藏字段(@JsonIgnore)之类的操作,您会发现这一点.要关闭循环,您需要更改'serve("*").with(GuiceContainer.class);' 类似'serve("*").with(GuiceContainer.class,ImmutableMap.of(JSONConfiguration.FEATURE_POJO_MAPPING,"true")'.你也可以删除JacksonJsonProvider绑定,因为它们似乎不是@Inject-在任何地方. (2认同)

小智 9

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

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

玩得开心!丹尼尔