2013-11-22 10 views
0

스택 오버플로가 발생하지만 문제를 해결했다고 생각합니다. 문제는 내 패널 위젯을 바인딩 할 때 재귀 적 주입입니다. 내가 만난 문제는 내 PanelWidget이 Map을 매개 변수로 사용한다는 것입니다. 문제는 이것이 무한 루프를 생성한다는 것입니다. 내가 Map<String, IDashboardWidget>을 제거하면GinMapProvider 스택 오버플로

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); 

문제는 물론 멀리 간다.

@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()); 
} 

PanelWidget 클래스는 또한이 시도하고 WidgetFactory 클래스를 주입하지만,이 역시 내 문제가 해결되지 않았다. 싱글 톤을 만들면 바인딩을 다시 만들지 못할 것입니다.

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

BTW 저는 이것을 GWTTestCase에서 실행하고 있는데, 이것이 차이가 있다고 생각하지 않습니다.

+2

지도 값 중 하나가 'PanelWidget'에 따라 달라질 수 있습니까? 여러분이'Map >' –

+1

THOMAS !!를 주입해야하는 것처럼 보입니다. 너 락이야. @Inject 생성자 매개 변수를 Provider 으로 변경하면 문제가 해결됩니다. 대답을 추가하고 악을 보내십시오. –

+0

완료, 답변으로 게시 됨. –

답변

1

특히지도에 넣은 것 중 하나와 PanelWidget 사이에 순환 종속성이있을 수 있습니다.

코드 모양 (WidgetFactory)이 주어지면 Map<String, IDashboardWidget> 대신 실제로 Map<String, Provider<IDashboardWidget>>이 필요하다고 생각됩니다. 그리고 그것은 순환 의존성을 부작용으로 잘라 버릴 것입니다.