2016-07-22 4 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-injectionJerseyの@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などは、リクエストイベントハンドラではなく、シングルトンを使用します。私はジャージーインジェクタにguiceを差し込む必要があると思います –

答えて

1

それは私のために働く。たぶん、JerseyとGuiceの正しいバインディングに関連する問題です。

リソース定義と定型コードで最小限の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を初期化していることがわかります。 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を使用していない場合は、簡単にpre-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; 
    } 
} 

最後に、ジャージを初期化し、内部インジェクタ(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); 
    } 
} 
関連する問題