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

时间:2010-04-19 18:44:15

标签: java guice jersey jax-rs jsr330

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

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

  • Iqbalyusuf在Jersey + Guice on Google App Engine Java上的帖子遭受了很多样板(手动获取和调用注入器)。我希望绑定和注入应该通过Guice注释在幕后发生。

  • Jonathan Curran的文章Creating a RESTful service with Jersey, Guice, and JSR-250给了我希望,因为它更新(2010),但没有进一步展示如何在Guice ServletModule中启动Jersey服务。但是,没有任何实例依赖注入的例子。我想这是留给读者的练习。 Curran的帖子实际上可能是连接Guice和Jersey的正确的第一步,所以我打算从那开始。

  • 诱人地James Strachan writes

      

    JAX-RS适用于依赖   注入框架,如Spring,   Guice,GuiceyFruit或JBossMC - 你   基本上可以选择你   偏爱。

    但我认为从实践者的角度来看,没有任何证据是正确的。

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

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

有没有人有一些非常重要的应用程序的例子,这些例子结合了Jersey和Guice而不会牺牲其中一个或另一个?无论如何我都会坚持这条道路,但泽西和吉斯的名单上的点点滴滴让我觉得我正在重复那些来到我面前的人的工作。

11 个答案:

答案 0 :(得分: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

答案 1 :(得分:21)

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

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

如果您对如何改进有任何疑问或建议 例如,随时通过github给我发消息。目标是制作 这是一个非常容易理解的Java堆栈上的REST介绍。

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

-Sunny

答案 2 :(得分:9)

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

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

玩得开心! 丹尼尔

答案 3 :(得分:3)

  

我相信我不能使用构造函数   注入泽西岛的任何资源   想控制这个

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

public NewsResource(@Inject NewsService service)

答案 4 :(得分:3)

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

我按照此处的说明操作:jersey-guice javadoc

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

答案 5 :(得分:3)

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

所以,在今天努力让Guice和Jersey相互配合之后,我经历了很多努力,我创建了以下示例项目来帮助您入门:

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

该项目使用以下技术:

  1. DI的Guice
  2. Jersey for RESTful API
  3. Jackson for POJO to JSON mapping
  4. 网络服务器的Jetty
  5. 摇篮
  6. 我想最重要的是,您不必明确指定您要添加的每个新资源类。只要您将它们添加到正在扫描的包中(查看malicious.mustard.modules.JerseyModule),就会自动找到它们!

答案 6 :(得分: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 adapter,它可能无法正常使用Jersey的未来点版本。 GWizard还提供RESTEasy JAX-RS模块,这是首选。

以下是有关此内容的博客文章可能有所帮助:http://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way

答案 7 :(得分:1)

这些例子对我来说都是很棒的开始,但我想要使用Jersey-Guice的完整MVC堆栈。我一直在努力提炼它。截至本周,这个MVC堆栈作为原型完全部署到Maven Central存储库。这意味着您现在可以使用一个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但您可以替换为您使用的任何内容。

答案 8 :(得分:1)

答案 9 :(得分:0)

我找到了一个有趣的Jetty + Guice + Jackson网络服务项目:https://github.com/talis/jersey-common/

答案 10 :(得分:0)

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

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

正如Sunny所说:

  

如果您对如何改进   例如,请随时通过github给我发消息。目的是要做到这一点   Java堆栈上的REST的入门指南。