我正在开发一个需要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
在我做错的地方有人可以帮助我吗?
答案 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。
看到这个问题和我的回答: