首页 文章

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

提问于
浏览
65

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

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

JAX-RS适用于依赖注入框架,如Spring,Guice,GuiceyFruit或JBossMC - 你基本上可以选择你喜欢的任何一个 .

但是,从实践者的角度来看,我没有看到任何证据 .

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

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

  • 我不确定我是否可以将@Inject与@PathParam,@ QueryParam等结合起来 .

  • 如何在MessageBodyWriter实现中使用注入

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

11 回答

  • 1

    Guice与泽西的整合并没有停滞不前 . 反之亦然 . 感谢Paul和他在Jersey后面的同伙,最新的1.7版本包含一个特殊的JerseyServletModule类,可以与基于Guice的servlet一起使用 . Guice-based constructor injection into JAX-RS resource works! 问题是在JAX-RS资源的构造函数中使用JAX-RS注释,例如@QueryParam . 你也不需要"industrial strength"例子 . Guice和Jersey都已经过战斗测试 . 您只需要一个完整的工作示例即可了解其工作原理 . 然后,您可以自己试验高级功能 . 有关使用Guice 3.0和Jersey 1.7的完整示例,请查看以下链接,这些都是最新版本:
    http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html

  • 53

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

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

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

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

    -Sunny

  • 3

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

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

    玩得开心!丹尼尔

  • 3

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

    您不能在要注入的构造函数参数之前使用guice 's constructor injection because creation of resource is managed by jersey. In this case you can use jersey' s @Inject 注释:

    public NewsResource(@Inject NewsService service)
    
  • 0

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

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

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

  • 21

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

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

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

    该项目使用以下技术:

    • DI的Guice

    • Jersey用于RESTful API

    • Jackson用于POJO到JSON映射

    • 用于Web服务器的Jetty

    • Gradle

    我想最重要的是你不要再添加了 . 只要您将它们添加到正在扫描的包中(查看 malicious.mustard.modules.JerseyModule ),就会找到它们自动!

  • 1

    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

  • 3
  • 9

    这些例子对我来说都是很好的开始,但我想要使用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但您可以替换为您使用的任何内容 .

  • 2

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

  • 0

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

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

    正如Sunny所说:

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

相关问题