【问题标题】:Dropwizard Guice Error: Missing dependency for constructorDropwizard Guice 错误:缺少构造函数的依赖项
【发布时间】:2016-08-22 10:39:49
【问题描述】:

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

应用类

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: 使用资源和/或检测到以下错误和警告 提供者类:
严重:缺少构造函数公共的依赖项 com.mobile.myservice.resources.MyResource(com.mobile.myservice.datastore.MyDataStoreInterface) 在参数索引 0

有人可以帮我解决我做错的地方吗?

【问题讨论】:

  • 你有没有在任何地方绑定过 MyServiceConfig?您使用的是哪种 Guice 集成?

标签: java guice jersey-2.0 dropwizard


【解决方案1】:

我怀疑你的问题是 dropwizard 在引擎盖下使用 Jersey。请注意,例外不是关于 Guice,而是关于 Jersey。 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);
    }
}

这适用于标准 Jersey / JAX-RS API。您可能需要适应 dropwizard。

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

【讨论】:

  • 在这种情况下,有集成框架可以为您处理这个问题。我正在使用github.com/xvik/dropwizard-guicey,对此我非常满意。这会自动为我发现并注入所有球衣组件(提供程序、过滤器、资源等)。
猜你喜欢
  • 2022-07-29
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
相关资源
最近更新 更多