2016-07-22 3 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저지의 @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

직접 저지 사용자가 아닙니다. Spring mvc 등은 요청 이벤트 핸들러보다는 싱글 톤을 사용한다. 어떻게해서든지 제니스 인젝터에 guice를 연결해야한다고 생각할 수 있습니다. –

답변

1

나를 위해 작동합니다. Jersey와 Guice의 올바른 바인딩에 관련된 문제 일 수 있습니다.

리소스 정의와 일부 상용구 코드로 최소한의 웹 응용 프로그램을 만들었습니다.

먼저 응용 프로그램 초기화 : 당신이 내가 거기 Guice를 초기화하는 것을 볼 수 있습니다

@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을 사용하지 않는 경우 사전 람다 코드로 쉽게 변환 할 수 있습니다. 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; 
    } 
} 

마지막으로 저지를 초기화하고 내부 주입기 (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); 
    } 
} 
관련 문제