Dropwizard Guice错误:缺少构造函数的依赖项

时间:2016-04-27 21:50:29

标签: java guice jersey-2.0 dropwizard

我正在开发一个需要Guice与dropwizard集成的项目。以下是我设计它的方式。

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{

    }

这是我写的MyServiceModule

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*/
  }
}

最后是我的资源文件

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

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

当我运行上述应用程序时,我收到以下错误:

  

错误[2016-04-27 20:34:29,669] com.sun.jersey.spi.inject.Errors:The   已使用资源和/或检测到以下错误和警告   提供者类:
  严重:缺少构造函数public的依赖项   com.mobile.myservice.resources.MyResource(com.mobile.myservice.datastore.MyDataStoreInterface)   在参数索引0

在我做错的地方有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我怀疑你的问题是dropwizard在引擎盖下使用Jersey。请注意,例外不是关于Guice而是泽西岛。 Jersey和Guice需要一些调整。泽西岛有自己的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);
    }
}

这适用于标准的Jersey / JAX-RS API。您可能需要调整为dropwizard。

看到这个问题和我的回答: