2016-07-22 96 views
1

我想在資源構造函數中一起使用Jersey的@QueryParam和Guice的@Inject。從尋找在網絡上,也出現了類似的問題,我之前問:
How can I mix Guice and Jersey injection?
http://users.jersey.dev.java.narkive.com/zlGMXuBe/can-queryparam-be-used-in-resource-constructor-along-with-guice-injection如何在資源構造函數中使用Jersey的@QueryParam和Guice注入?

現在看來,這是不可能的。然而,這些問題已經過去幾年了,我現在想做的事情也是如此?

這裏是我想要做作爲一個例子一些代碼:

@Path("/mypath") 
public class MyResource { 
    private Manager manager; 
    private String type; 

    @Inject 
    public MyResource(Manager manager, 
        @QueryParam("type") String type) { 
    this.manager = manager; 
    this.type = type; 
    } 

    @GET 
    @Produces("text/plan") 
    @Path("/{period}") 
    public String myMethod(@PathParam("period") String period) { 
    return manager.foo(period, type); 
    } 
} 

謝謝!

+1

這沒有意義? 'MyResource'是一個單例,並處理所有請求。在施工時沒有請求,因此沒有'@ QueryParam'。 –

+0

@LanceJava如果你刪除了Guice'@Inject'的東西,它的工作原理。你可以在請求中傳入一個查詢參數,構造函數會將它設置爲你傳入的任何東西。 –

+0

好的,我自己不是Jersey用戶。 Spring mvc等使用單例而不是每個請求事件處理程序。我只能假設你需要以某種方式將吉斯插入澤西島噴油器 –

回答

1

它適合我。也許是與澤西和吉斯的正確約束有關的問題。

我用你的資源定義和一些樣板代碼創建了一個最小的web應用程序。

首先應用程序初始化:

@WebListener 
@Singleton 
public class AppContextListener implements ServletContextListener { 
    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     new GuiceBootstrap().contextInitialized(sce); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     // no op 
    } 
} 

你可以看到有我初始化吉斯那裏。這是Guice代碼。

public class GuiceBootstrap extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector((Module) binder -> binder.bind(Manager.class) 
                  .to(ManagerImpl.class)); 
    } 
} 

它是Java 8的語法,但如果你不使用Java 8,它很容易轉換爲lambda之前的代碼。我創建了一個Guice注射器只有一個綁定。

Manager和實現類非常簡單。

public interface Manager { 
    String foo(String period, String type); 
} 

public class ManagerImpl implements Manager { 
    @Override 
    public String foo(String period, String type) { 
     return "Got " + period + " " + type; 
    } 
} 

最後是初始化Jersey並將其內部注入器(HK2)綁定到Guice的代碼。

@ApplicationPath("api") 
public class ApiRest extends ResourceConfig { 

    @Inject 
    public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) { 
     packages("net.sargue.so38531044"); 
     GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator); 
     GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class); 
     Injector injector = (Injector) servletContext.getAttribute(Injector.class.getName()); 
     if (injector == null) 
      throw new RuntimeException("Guice Injector not found"); 
     guiceBridge.bridgeGuiceInjector(injector); 
    } 
} 
相關問題