Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
依赖注入在GWT2.1中不起作用_Gwt_Dependency Injection_Gwt2_Gwt Gin - Fatal编程技术网

依赖注入在GWT2.1中不起作用

依赖注入在GWT2.1中不起作用,gwt,dependency-injection,gwt2,gwt-gin,Gwt,Dependency Injection,Gwt2,Gwt Gin,我有一个新项目,我正在使用GWT视图,比如复合视图等 我已经使用GinInjector注入了主菜单中的项目(如下面的ProductList)。这个很好用 在某个地方,我想从一个小组件引用到我主菜单中的一个项目,以便更新它。我尝试以这种方式注入它: public class ProductForm extends Composite { ... @Inject ProductList list; .... } 但是当我使用列表时,我总是得到null。其中,Produc

我有一个新项目,我正在使用GWT视图,比如复合视图等

我已经使用GinInjector注入了主菜单中的项目(如下面的
ProductList
)。这个很好用

在某个地方,我想从一个小组件引用到我主菜单中的一个项目,以便更新它。我尝试以这种方式注入它:

public class ProductForm extends Composite {
   ...
   @Inject 
   ProductList list;
   ....

}
但是当我使用
列表时,我总是得到
null
。其中,
ProductList
的定义如下:

public class MyModule extends AbstractGinModule {
   ...
   @Override
   protected void configure() {
      bind(ProductList.class).asEagerSingleton();
      bind(ProductForm.class).asEagerSingleton();
   }
   ...
}
知道我做错了什么吗

解决方案: 我没有提到ProductForm是使用UIBinder的@UIField标记的ProductList元素,因此注入它将创建一个新对象,而不是使用UIBinder创建的对象


我必须重新构造代码,以包含演示者和事件总线,这样就不需要在视图之间直接引用(除了@UIField属性)。

Ginject是否正在创建ProductForm?我认为可能需要这样做才能使它填充注入的变量。

我正在处理Gin文档:我将在这里引用它:

杜松子酒“魔力” Gin试图让注射变得无痛,并从代码中删除尽可能多的样板文件。要做到这一点,生成的代码包括一些幕后的魔法,这里将对此进行解释

延迟绑定 Gin优化代码的一种方法是自动化GWT延迟绑定。因此,如果通过延迟绑定(但不是通过Guice/Gin绑定)注入接口或类1绑定,Gin将在内部调用GWT.create并注入结果。一个例子是GWT消息和常量(用于i18n目的):

注意:Gin不会绑定在singleton范围内通过GWT.create创建的实例。不过,这不会导致不必要的开销,因为延迟绑定生成器通常在其生成的代码中实现单例模式。

您可以在此URL中自己查看:

它没有提到为什么不能通过延迟绑定和注入自动生成单例

您可以通过手动创建来修复此问题,方法是在构造函数中使用
GWT.create(YourFactoryInterface.class).getProductList()

这意味着对于测试pupose,您需要将GWT.create拉入一个单独的方法中,并在子类中重写它,然后将其用于测试,如:

YourFactoryInterface getFactory() {
  return GWT.create(YourFactoryInterface.class)
}


Gin的
asEagerSingleton()
绑定被破坏了很长一段时间,并注入null。不确定修复何时开始,但我在v1.0上遇到了一些问题。如果你感兴趣的话,看看或者。我要么切换到(Singleton.class)
绑定中的常规
,要么确保您使用的是Gin 1.5。

啊,好吧,只要需要实例,自动生成的代码就会这样生成:GWT.create(RequiredClass.class)。要使此代码正常工作,RequiredClass必须具有可解析的@Injected或0参数构造函数。当使用GWT.create以这种方式生成延迟绑定代码时,我明白了为什么总是返回singleton很困难。谢谢!这对我帮助很大!请向我们展示您获取ProductList对象的代码。您的问题得到回答了吗?
YourFactoryInterface getFactory() {
  return GWT.create(YourFactoryInterface.class)
}
getFactory().getProductList()