2016-04-27 17 views
0

私はGuiceとdropwizardとの統合を必要とするプロジェクトに取り組んでいます。私がそれを設計した方法は次のとおりです。Dropwizard Guice Error:コンストラクタの依存関係がありません

ApplicationClass

public class MyService extends Application<MyServiceConfig> { 

    public static void main(String[] args) throws Exception { 
     new MyService().run(args); 
    } 

    @Override 
    public void initialize(Bootstrap<MyServiceConfig> bootstrap) { 
     GuiceBundle<MyServiceConfig> guiceBundle = GuiceBundle.<MyServiceConfig>newBuilder() 
       .addModule(new MyServiceModule()) 
       .setConfigClass(MyServiceConfig.class) 
       .enableAutoConfig(this.getClass().getPackage().getName()) 
       .build(); 

     bootstrap.addBundle(guiceBundle); 
    } 

    @Override 
    public void run(MyServiceConfig config, Environment environment) throws Exception{ 

    } 

この私はこれらが私のデータストアファイル

public interface MyDataStoreInterface { 
    public void method1(); 
} 

public class MyDataStore implements MyDataStoreInterface { 
    public MyDataStore(Config1 config1, Config2 config2){ 
    /*implementation*/ 
    } 
    public void method1(){ 
    /*implementation*/ 
    } 
} 

そして最後に、次のです

public class MyServiceModule extends AbstractModule{ 
    @Provides 
    public MyDataStoreInterface getDataStore(MyServiceConfig myServiceConfig){ 
     return new MyDataStore(myServiceConfig.getConfig1(), myServiceConfig.getConfig2()); 
    } 

    @Override 
    protected void configure() { 

    } 
} 

を書いたMyServiceModuleは私のリソースファイル

です

私は上記のアプリケーションを実行すると、私は次のエラーを取得する:

ERROR [2016-04-27 20:34:29,669] com.sun.jersey.spi.inject.Errors: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for constructor public com.mobile.myservice.resources.MyResource(com.mobile.myservice.datastore.MyDataStoreInterface) at parameter index 0

誰かが私が間違っているのどこに私を助けることができますか?

+0

あなたはどこにでもMyServiceConfigをバインドしました:

はこの質問と私の答えを参照してください? Guiceとの統合はどのようなものを使用していますか? – pandaadb

答えて

0

私はあなたの問題がdropwizardがボンネットの下でジャージーを使用していると思っています。例外はGuiceではなくJerseyであることに注意してください。ジャージーとGuiceは一緒に働くいくつかの微調整を必要とします。 Jerseyには独自のDIフレームワーク(HK2)があります。あなたはそれらを橋渡しする必要があります。

を編集してください:dropwizard-guicey、あなたの問題を対象とするプロジェクトを見てください。以下のコメントのために@pandaadbに感謝します。

非常に迅速なコード例:

@ApplicationPath("api") 
public class ApiRest extends ResourceConfig { 
    private static final Logger log = LoggerFactory.getLogger(ApiRest.class); 

    @Inject 
    public ApiRest(ServiceLocator serviceLocator, ServletContext servletContext) { 
     log.debug("Inicialitzant Jersey."); 
     packages("net.sargue.app.api"); 

     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); 
    } 
} 

標準ジャージー/ JAX-RSのAPIのために動作します。おそらくdropwizardに調整する必要があります。

+0

この場合、これを処理する統合フレームワークがあります。私はhttps://github.com/xvik/dropwizard-guiceyを使用しており、私はそれに非常に満足しています。これは、自動的に私のためにすべてのジャージーコンポーネント(プロバイダ、フィルタ、リソースなど)を検出して注入します。 – pandaadb

関連する問題