我正在堆栈溢出,但我想我已经确定了问题所在。问题是绑定面板小部件时递归注入。我遇到的问题是我的PanelWidget将Map作为参数。然后的问题是,这将创建一个无限循环。

GinMapProvider

    GinMapBinder<String, IDashboardWidget> mapBinder = GinMapBinder
            .newMapBinder(binder(), String.class, IDashboardWidget.class);

    mapBinder.addBinding(IGaugeWidgetModel.class.getName()).to(MockGaugeWidget.class);
    mapBinder.addBinding(IPlotWidgetModel.class.getName()).to(PlotWidget.class);
    mapBinder.addBinding(ITableWidgetModel.class.getName()).to(TableWidget.class);
    mapBinder.addBinding(IPanelWidgetModel.class.getName()).to(PanelWidget.class);


如果我删除Map<String, IDashboardWidget>,问题就自然消失了。

PanelWidget类

@Inject
public PanelWidget(final EventBus eventBus, final Resources resources, Map<String, IDashboardWidget> widgetProvider) {
    super(eventBus, resources);
    this.widgetProvider = widgetProvider;
    initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
    widgetsPanel.getElement().getStyle().setPosition(Position.RELATIVE);

    this.addDomHandler(widgetSelectedHandler, ClickEvent.getType());
}


我也尝试过这个,并注入WidgetFactory类,但这也不能解决我的问题。我曾希望创建一个单例将阻止它重新创建绑定。

@Inject
@Provides
@Singleton
WidgetFactory widgetFactory(Map<String, IDashboardWidget> widgetProvider) {
    return new WidgetFactory(widgetProvider);
}


顺便说一句,我在GWTTestCase中运行它,但我认为这没有什么区别。

最佳答案

您可能具有循环依赖关系,特别是在您放入地图中的事物之一和PanelWidget之间。

考虑到代码(WidgetFactory)的外观,我认为您可能实际上需要Map<String, Provider<IDashboardWidget>>而不是Map<String, IDashboardWidget>。这样做会减少循环依赖关系。

关于java - GinMapProvider堆栈溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20151190/

10-11 09:24