2016-04-27 72 views
0

我正在研究一个需要Guice与dropwizard集成的项目。以下是我设计它的方式。Dropwizard Guice错误:缺少对构造函数的依赖

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 class MyServiceModule extends AbstractModule{ 
    @Provides 
    public MyDataStoreInterface getDataStore(MyServiceConfig myServiceConfig){ 
     return new MyDataStore(myServiceConfig.getConfig1(), myServiceConfig.getConfig2()); 
    } 

    @Override 
    protected void configure() { 

    } 
} 

这是我的数据存储文件

public interface MyDataStoreInterface { 
    public void method1(); 
} 

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

而且最后以下是我的资源文件MyServiceModule

@Path("/documents") 
@Produces(MediaType.APPLICATION_JSON) 
public class MyResource { 
    private MyDataStoreInterface myDataStore; 

    @Inject 
    public MyResource(MyDataStoreInterface myDataStore) { 
    this.myDataStore = myDataStore; 
    } 
} 

当我运行上面的应用程序,我得到以下错误:

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在引擎盖下使用了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