GWT GIN 现场级注入

2024-05-25

我们正在评估 GWT 项目中使用 GIN 的情况,并通过构造函数参数进行典型注入,取得了良好的结果。我们遇到的困难是现场级注入。这些字段最终总是为空。有没有人有一个很好的例子来说明如何使用 GIN 正确实现字段级注入?

Update:

这是一些与我们类似的示例代码:

public class MVP implements EntryPoint {

  public static final HandlerManager EVENT_BUS = new HandlerManager(null);
  private final MVPInjector _injector = GWT.create(MVPInjector.class);

  public void onModuleLoad() {
    // set up layout for module
    RootLayoutPanel.get().add(mainPanel);

    // initialize presenters
    ListPresenter listPresenter = _injector.listPresenter();
    DetailPresenter detailPresenter = _injector.detailPresenter();

    listPresenter.go(listContainer);
    detailPresenter.go(detailContainer);

    // simulate data coming in from RPC call
    EVENT_BUS.fireEvent(new DataReadyEvent(getData()));
  }
}

public class ListPresenter {

  private final HandlerManager _eventBus;
  private final Map<String, Fruit> _myRecords = new HashMap<String, Fruit>();
  private final Display _view;

  @Inject
  public ListPresenter(Display argView, HandlerManager argEventBus) {
    _eventBus = argEventBus;
    _view = argView;
  }

  public void go(HasWidgets argContainer) {
    argContainer.clear();
    argContainer.add(_view.asWidget());
  }

  public interface Display {
    public Widget asWidget();

    public void clear();

    public SingleSelectionModel<ViewProxy> getSelectionModel();

    public void setData(List<ViewProxy> argData);
  }
}

public class DetailPresenter {

  private final HandlerManager _eventBus;
  private final Display _view;
  private Fruit _myRecord;

  @Inject
  private ImagePresenterFactory _imagePresenterFactory;

  @Inject
  private TestPresenter _testPresenter;

  @Inject
  public DetailPresenter(Display argView, HandlerManager argEventBus) {
    _view = argView;
    _eventBus = argEventBus;
  }

  public void go(HasWidgets argContainer) {
    argContainer.clear();
    argContainer.add(_view.asWidget());

    if (_testPresenter != null) {
      _testPresenter.go();
    }
  }

  public interface Display {
    public Widget asWidget();

    public HasText getDescriptionControl();

    public HasClickHandlers getImageControl();

    public HasText getNameControl();

    public HasClickHandlers getSaveControl();

    public void setEnabledControls(boolean argEnabled);
  }
}

public class TestPresenter {

  @Inject
  HandlerManager _eventBus;

  public TestPresenter() {}

  public void go() {
    if (_eventBus != null) {
      _eventBus.toString();
    }
    else {
      // event bus was not injected
    }
  }
}

@GinModules(MVPModule.class)
public interface MVPInjector extends Ginjector {

  DetailPresenter detailPresenter();

  ListPresenter listPresenter();

}

public class MVPModule extends AbstractGinModule {

  @Provides
  @Singleton
  public HandlerManager getEventBus() {
    return MVP.EVENT_BUS;
  }

  @Provides
  public TestPresenter getTestPresenter() {
    return new TestPresenter();
  }

  @Override
  protected void configure() {
    bind(ListPresenter.Display.class).to(ListView.class);
    bind(DetailPresenter.Display.class).to(DetailView.class);
    bind(ImagePresenter.Display.class).to(ImagePopup.class);
    install(new GinFactoryModuleBuilder().build(ImagePresenterFactory.class));
  }

  public interface ImagePresenterFactory {
    public ImagePresenter createImagePresenter(ImageResource argImage);
  }

}

上面的代码中,我去掉了大部分不涉及GIN的代码。 DetailPresenter需要的TestPresenter注入成功,但是TestPresenter需要的HandlerManager始终为null。可以看到,构造函数中并没有使用注入的HandlerManager。


更新,查看示例代码:

@Provides
public TestPresenter getTestPresenter() {
  return new TestPresenter();
}

因为您是自己创建的,所以它假设您已经处理过任何注入。删除此方法,它将调用默认构造函数(如果需要,则在那里注入),然后访问任何其他注入站点。

您可能遇到的另一个问题是:有多个 HandlerManager 实现,请确保对 HandlerManager 的所有引用都使用相同的包。


原答案:

当构造函数运行时它们将为 null,但这是有道理的 - 当注入器还没有机会分配所有字段时,它们怎么可能是任何其他值。考虑一下这将如何运行(这里表示为有问题的合法 java,因为字段可能不是公共的):

InstanceToInject instance = new InstanceToInject(...);
instance.field = provideFieldValue();

当该字段甚至可以被分配时,您的构造函数已经运行。

如果运行另一个方法时该字段为空,请确保该方法没有运行由构造函数,但是是在注入完成其工作之后。其他可能为空的情况是@Inject带注释的设置器。

假设不是这些情况(最简单的检查方法是设置断点,并确保注入器不在调用堆栈中),请确保该字段确实有一个@Inject,并且它不绑定到 null 实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GWT GIN 现场级注入 的相关文章

  • GWT 检测 GAE 版本更改并重新加载

    我的用户平均每次使用我的 GWT 应用程序 40 分钟 因此当我升级 GAE 后端的版本号时 他们在浏览器中运行的版本有很长一段时间与版本不匹配在服务器上支持它 大多数功能都被破坏 抛出不兼容的 RemoteServiceException
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • 有状态对象的 IoC 依赖注入(非全局)

    我是这个 IoC 和 DI 业务的新手 我觉得如果你传递的是全局范围的对象 我就明白了这个概念 但是当你需要传递一个全局范围的对象时 我不明白它是如何工作的特定的逻辑状态 因此 例如 如果我想将一个人对象注入到一个写入文件命令对象中 我如何
  • Nestjs全局pubsub实例和依赖注入

    我遵循了有关 pubsub subscriptions 的 Nestjs DOCS 根据示例 pubsub 在给定解析器的顶部初始化为 const pubSub new PubSub 后来文档说 我们在这里使用了本地 PubSub 实例 相
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • 从 Autofac 容器解析通用接口的 IEnumerable

    我不确定这是否可能 我见过其他一些帖子提出类似的问题 但没有一个得到满意的答案 我想要做的是解析 Autofac 中具有不同泛型类型的接口集合 所以类的构造函数看起来像这样 public class SomeClass
  • GWT 中什么是可序列化的或不可序列化的?

    我的 GWT 项目中有这个简单的对象 我无法通过电汇发送它 在这样的类中放置构造函数是不可能的吗 public class MceDto implements IsSerializable public MceDto String uri
  • 为什么要使用依赖注入?

    我试图理解依赖注入 http en wikipedia org wiki Dependency injection DI 我再一次失败了 这看起来很愚蠢 我的代码从来不会乱七八糟 我几乎不编写虚拟函数和接口 尽管我千载难逢 并且我的所有配置
  • 将多个 GWT 应用程序集成到可插拔平台中

    我想询问您关于如何将多个基于 GWT 的 Web 应用程序组合成一个灵活的 可插拔的系统的想法 该系统有点类似于新的 Google 产品组合 以下是详细信息 想法 要求 屏幕顶部应该有一个栏 系统栏包含每个 插件应用程序 的菜单按钮 该列表
  • GWT 多个 html 页面和导航

    您好 首先我想提一下 我知道基于 ajax 的应用程序和同一页面的重用 这里的要求是 我想要两个单独的页面 一个用于登录 另一个用于主应用程序 现在 这并不是因为我只是想要它 而是因为我在两个页面中有非常不同的布局 我很乐意将其与 html
  • GWT 的 RPC 与 AJAX 不同吗?

    与 AJAX 调用相比 GWT Google Web Toolkit 的 RPC 远程过程调用 用于从浏览器 javascript 到服务器的异步操作有何不同或相似 如果它们不同 有人可以帮助我理解它们有何不同吗 我还听说这个 RPC 实现
  • 最终属性 @Value 中的 Spring 属性注入 - Java

    一个关于 Spring 从属性文件注入最终属性的简单问题 我有一个属性文件 我想在其中存储文件路径 通常 当我使用属性文件时 我使用如下内容设置类属性 private Value someProps prop field String so
  • Grails:在域类中动态注入服务

    我需要注入基于域属性的服务 到目前为止我想出了以下内容 ApplicationHolder application getServiceClass package property Service clazz 但以这种方式加载它不会注入它的
  • 在 ASP.NET Core 的中间件中注入服务

    我想根据 HTTP 标头值注入服务 所以我有 2 个类 DbDataProvider 和 InMemDataProvider 它们都是从 IDataProvider 实现的 每当进行 API 调用时 客户端都会传递一个标头 该标头确定是需要
  • Mediatr 范围问题

    我正在使用 Mediatr 处理来自队列的消息 我可以得到一个简单的例子来工作 但是 当我尝试将对象注入到我的处理程序中时 我遇到了问题 public class MessageCommandHandler IRequestHandler
  • 如何在@FacesConverter中注入@EJB、@PersistenceContext、@Inject、@Autowired等?

    我怎样才能注入像这样的依赖项 EJB PersistenceContext Inject AutoWired等在一个 FacesConverter 在我的具体情况下 我需要通过注入 EJB EJB FacesConverter public
  • GWT RequestFactory 和多个请求

    有没有办法使用 RequestFactory 在单个请求中创建两个实体 我试过 EmployeeRequest request requestFactory employeeRequest EmployeeProxy newEmployee
  • 调整 Horizo​​ntalPanel 单元格的大小

    新手警报 我一直在疯狂地寻找一种方法来调整 Horizo ntalPanel 的特定单元格的大小 我想做的是实现一个 2 单元格水平面板并将左侧单元格设置为 200px 但是 我试图让正确的单元格填充窗口的其余部分 而不是其单元格内容 只见
  • 为什么使用 GWT.create() 而不是 new?

    有什么区别GWT create SomeClass class and new SomeClass 为什么你会使用其中一种而不是另一种 GWT createGWT 编译器使用延迟绑定 延迟绑定是 GWT 编译器的一项功能 它的工作原理是在编

随机推荐