簡體   English   中英

關於使用Jersey和Guice進行RESTful服務的實用建議

[英]Practical advice on using Jersey and Guice for RESTful service

從我在網上看到的情況來看,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,而不會在這個過程中犧牲一個或另一個? 無論如何我都會堅持這條道路,但澤西和吉斯的名單上的點點滴滴讓我覺得我正在重復在我面前的其他人的工作。

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 / Jersey / Jetty / Jackson示例應用程序:

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

如果您對如何改進示例有任何疑問或建議,請隨時通過github給我發消息。 目標是使其成為Java堆棧上REST的非常容易獲得的介紹。

希望這有幫助 - 祝你有個美好的一天!

-Sunny

受Sunnys示例應用程序的啟發,我創建了一個類似的示例項目,該項目使用標准WAR文件進行部署,例如在Apache Tomcat中。 你可以在這里找到這個項目:

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

玩得開心! 丹尼爾

我相信我不能對任何資源使用構造函數注入,因為Jersey想控制它

你不能使用guice的構造函數注入,因為資源的創建是由jersey管理的。 在這種情況下,您可以在要注入的構造函數參數之前使用jersey的@Inject注釋:

public NewsResource(@Inject NewsService service)

雖然Sunny Gleason的例子很棒,但現在有點過時了。

因此,在今天努力讓Guice和Jersey相互配合之后掙扎了很多,我創建了以下示例項目來幫助您入門:

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

該項目使用以下技術:

  1. DI的Guice
  2. Jersey for RESTful API
  3. 傑克遜為POJO到JSON映射
  4. Jetty用於Web服務器
  5. 搖籃

我想最重要的是你不必明確指定你要添加的每個新資源類。 只要您將它們添加到正在掃描的包中(查看malicious.mustard.modules.JerseyModule ),它們就會自動找到!

我最初嘗試使用Guice在我的Jersey注釋類上進行構造函數注入時遇到了類似的問題,但最終還是讓它工作了,盡管有一個相當簡單的應用程序。

我按照這里的說明: jersey-guice javadoc

在我的情況下,我需要從我的web.xml中刪除標准的Jersey配置(比如Jersey ServletContainer)並且只保留Guice監聽器和Guice過濾器。 一旦我這樣做,Guice被調用來創建我的JAX-RS注釋對象,並且Jersey按預期注入我的JAX-RS注釋方法(如@GET等)。

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的完整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但您可以替換為您使用的任何內容。

我創建了一個Guice 4.2,Jetty 9.4和Jersey 2.7示例應用程序:

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

正如Sunny所說:

如果您對如何改進示例有任何疑問或建議,請隨時通過github給我發消息。 目標是使其成為Java堆棧上REST的非常容易獲得的介紹。

我找到了一個有趣的Jetty + Guice + Jackson網絡服務項目: https//github.com/talis/jersey-common/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM