关于使用Jersey和Guice进行RESTful服务的实用build议
从我在网上可以find的情况来看,自从2008年两队出现僵局以来,Guice + Jersey整合技术的状态一直停滞不前。 问题的关键在于JAX-RS注释执行字段和方法注入,而且这种方法与Guice自己的dependency injection并不能很好地发挥作用。
我发现的几个例子还不足以阐明:
-
Iqbalyusuf 在Google App Engine Java上对Jersey + Guice的post遭受了大量的样板(手动获取和调用注入器)。 我希望绑定和注入应通过Guice注释发生在幕后。
-
Jonathan Curran的文章“ 使用Jersey,Guice和JSR-250创buildRESTful服务”给了我希望,因为它比2010年更加stream行,但是没有展示如何在Guice ServletModule中启动Jersey服务。 但是,没有任何实际的dependency injection的例子。 我想这是给读者的一个练习。 Curran的职位实际上可能是Guice和Jersey接线的正确的第一步,所以我打算从这开始。
-
引人注目的James Strachan写道 :
JAX-RS与Spring,Guice,GuiceyFruit或JBossMC等dependency injection框架一起工作良好 – 基本上可以select你喜欢的任何一个。
但是从实践者的angular度来看,我没有看到任何证据。
我觉得缺乏的是关于如何将JAX-RS和Guice标注结合起来的实例和解释。 例如:
- 我相信我不能使用构造函数注入任何资源泽西希望控制这一点
- 我不确定我是否可以将@Inject和@PathParam,@QueryParam等结合起来。
- 如何在MessageBodyWriter实现中使用注入
有没有人有例子,最好有源代码,结合了Jersey和Guice而不牺牲这个过程中的一个或另一个的非平凡的应用程序? 无论如何,我一直在这条路上,但泽西和吉斯名单上的点点滴滴让我觉得我正在重复前面的其他人的工作。
吉泽与泽西的融合并没有停滞。 事实恰恰相反。 感谢Paul和他在Jersey后面的同伙,最新的1.7版本包含一个特殊的JerseyServletModule类,可以与基于Guice的servlet一起工作。 基于Guice的构造器注入JAX-RS资源的工作原理! 问题是在JAX-RS资源的构造函数中使用JQuery-RS注释(如@QueryParam)。 你不需要它! 你一直使用Guice进行POJO注射,包括单身。 然后,JAX-RS只是parsing基于HTTP的RESTful API(如URLpath,查询参数,内容types等)的结晶。您也不需要“工业强度”示例。 吉斯和泽西都已经过战斗testing。 你只需要一个完整的工作示例来看看它是如何工作的。 然后,您可以自行尝试高级function。 查看以下链接,了解使用Guice 3.0和Jersey 1.7的所有最新版本的完整示例:
http://randomizedsort.blogspot.com/2011/05/using-guice-ified-jersey-in-embedded.html
我在这里创build了一个Guice / Jersey / Jetty / Jackson示例应用程序:
http://github.com/sunnygleason/j4-minimal
如果您对如何改进示例有任何疑问或build议,请随时通过github给我发消息。 目标是使这个Java堆栈上的REST非常容易获得。
希望这有助于 – 有一个美好的一天!
-Sunny
受Sunnys示例应用程序的启发,我创build了一个使用标准WAR文件进行部署的类似示例项目,例如在Apache Tomcat中。 你可以在这里find这个项目:
https://github.com/danbim/template-guice-jersey-tomcat
玩的开心! 丹尼尔
我相信我不能使用构造函数注入任何资源泽西希望控制这一点
你不能使用guice的构造函数注入,因为资源的创build是由jerseypipe理的。 在这种情况下,你可以在你想要注入的构造参数之前使用jersey的@Inject
注解:
public NewsResource(@Inject NewsService service)
我最初有类似的问题尝试使用Guice在我的泽西注释类上做构造函数注入,但最终得到它的工作,虽然有一个相当微不足道的应用程序。
我遵循这里的指示: jersey-guice javadoc
在我的情况下,诀窍是我需要从我的web.xml(如Jersey ServletContainer)中删除标准的泽西configuration,并只保留Guice侦听器和Guicefilter。 一旦我做了Guice被调用来创build我的JAX-RS注释对象,泽西正在注入我的JAX-RS注释方法(如@GET等),如预期的那样。
尽pipeSunny Gleason的例子很好,但现在已经有点过时了。
所以,经过今天的努力之后,我们试图让Guice和Jersey互相配合,我创build了下面的示例项目来帮助你开始:
https://github.com/MaliciousMustard/gradle-guice-jersey-jetty
该项目正在使用以下技术:
- DI的Guice
- Jersey用于RESTful API
- jacksonPOJO到JSON映射
- docker的networking服务器
- 摇篮
我想最重要的是你不必显式地指定你添加的每一个新的资源类。 只要您将它们添加到正在扫描的软件包(请参阅malicious.mustard.modules.JerseyModule
),它们就会自动find!
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 : //blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way
Jersey-Guice插件Javadoc提供了一个相当不错的描述:
这些例子对我来说都是伟大的开始,但我想要一个完整的MVC栈,使用Jersey-Guice作为核心。 我一直在努力提炼一下。 截至本周,这个MVC栈已经作为一个原型被完全部署到Maven Central仓库。 这意味着您现在可以使用一个Maven命令创build一个新的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,但是你可以用你使用的任何东西replace。
我发现了一个轻量级Jetty + Guice + Jackson Web服务的有趣项目: https : //github.com/talis/jersey-common/