java di




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

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

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

public NewsResource(@Inject NewsService 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


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-wayhttp://blorn.com/post/107397841765/guice-and-jersey-2-the-easy-way


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

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

玩的開心! 丹尼爾



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

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

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


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

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

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

該項目使用以下技術:

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

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





jsr330