2016-04-20 14 views
0

Ich habe bereits Gin assistierte Injektion ein paar Mal verwendet, aber ich bin neu zu gwtp und ich bin mit einer Fehlermeldung konfrontiert, die ich nicht verstehe, während ein PresenterWidget mit meiner Fabrik instanziieren, auch nach mehreren Beiträge zu diesem Thema lesen ...Assisted injection error beim Versuch, Presenter zu erstellen

[ERROR] Error injecting @com.google.inject.assistedinject.Assisted(value=) java.lang.Integer: 
Unable to create or inherit binding: 
Binding requested for constant key '@com.google.inject.assistedinject.Assisted(value=) java.lang.Integer' but no explicit binding was found; 
Path to required node: 
org.moshika.dtp.client.application.book.page.PagePresenter [com.gwtplatform.mvp.client.gin.AbstractPresenterModule.bindPresenterWidget(AbstractPresenterModule.java:260)] 

Kontext: muss ich auf dem Bildschirm, um den Inhalt eines Buches anzuzeigen. Im Moment benutze ich einen BookPresenter mit Proxy und Ort und ich werde versuchen, Seiten als PresenterWidget zu binden/zu lösen. Ich denke nicht, dass meine Seiten als CellWidget implementiert werden können, da ich viele DTP/WYSIWYG-Funktionen implementieren werde.

Mein Modul:

public class CommonModule extends AbstractGinModule { 

@Override 
protected void configure() { 
    // DefaultPlaceManager Places 
    install(new DefaultModule.Builder().defaultPlace(NameTokens.SEARCH).errorPlace(NameTokens.ERROR).unauthorizedPlace(NameTokens.ERROR).build()); 

    install(new GinFactoryModuleBuilder().build(PagePresenter.Factory.class)); 

    RestDispatchAsyncModule.Builder dispatchBuilder = new RestDispatchAsyncModule.Builder(); 
    install(dispatchBuilder.build()); 

    bindConstant().annotatedWith(RestApplicationPath.class).to("rest"); 

    bind(ResourceLoader.class).asEagerSingleton(); 

    bindPresenter(BookPresenter.class, BookPresenter.MyView.class, BookViewTablet.class, BookPresenter.MyProxy.class); 

    bindPresenterWidget(PagePresenter.class, PagePresenter.MyView.class, PageViewTablet.class); 

} 

BookPresenter:

public class BookPresenter extends Presenter<BookPresenter.MyView, BookPresenter.MyProxy> 
    implements BookUiHandlers { 

    public interface MyView extends View, HasUiHandlers<BookUiHandlers> { 
    } 

    @ProxyStandard 
    @NameToken(NameTokens.BOOK) 
    public interface MyProxy extends ProxyPlace<BookPresenter> { 
    } 

    static final Slot<PagePresenter> SLOT_BOOK = new Slot<PagePresenter>(); 

    private ResourceDelegate<PageResources> pageDelegate; 

    private PagePresenter.Factory factory; 

    @Inject 
    BookPresenter(EventBus eventBus, 
     MyView view, MyProxy proxy, 
     ResourceDelegate<PageResources> pageDelegate, 
     PagePresenter.Factory factory) { 
     super(eventBus, view, proxy, ApplicationPresenter.SLOT_MAIN); 

     view.setUiHandlers(this); 
     this.pageDelegate= pageDelegate; 
     this.factory= factory; 
    } 

    @Override 
    protected void onReveal() { 
     super.onReveal(); 
     NavigationVisibilityEvent.fire(this, true); 
     fetchPages(0, 5); 
    } 

    @Override 
    public void fetchPages(final int offset, int limit) { 
     pageDelegate.withCallback(new AsyncCallback<List<PageDto>>() { 

      @Override 
      public void onFailure(Throwable caught) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void onSuccess(List<PageDto> dtos) { 
       clearSlot(SLOT_BOOK); 
       for (PageDto dto : dtos) { 
        PagePresenter pagePresenter = factory.create(dto.getFolioPage()); 
        addToSlot(SLOT_DEROULE, pagePresenter); 
        pagePresenter.refreshModel(); 
       } 
      } 
     }).list(offset, limit); 
    } 
} 

PagePresenter und Factory:

public class PagePresenter extends PresenterWidget<PagePresenter .MyView> 
    implements PageUiHandlers { 

    public interface MyView extends View { 
     void setFolio(Integer folio); 
    } 

    public interface Factory { 
     CahierPageJourPresenter create(Integer folio); 
    } 

    private ResourceDelegate<PageResources> pageDelegate; 

    private Integer folioPage; 

    @Inject 
    PagePresenter(EventBus eventBus, MyView view, 
     ResourceDelegate<PageResources> pageDelegate, 
     @Assisted Integer folio) { 
     super(eventBus, view); 
     this.pageDelegate= pageDelegate; 
     this.folio= folio; 
} 

    public void refreshModel() { 
     pageDelegate.withCallback(new AsyncCallback<PageDto>() { 

      @Override 
      public void onFailure(Throwable caught) { 
       // TODO Auto-generated method stub 
      } 

      @Override 
      public void onSuccess(PageDtodto) { 
       getView().setFolio(dto.getFolio()); 
      } 
     }).get(folio); 
    } 
} 

Es könnte ein sehr dummer Fehler sein, da ich nicht sehe, was ich anders mache als alle anderen Posts zum gleichen Thema ...

Antwort

1

Wenn Sie hier die assistierte Injektion verwenden möchten, rufen Sie nicht bindPresenterWidget(PagePresenter.class, PagePresenter.MyView.class, PageViewTablet.class); direkt. Binden Sie stattdessen nur die Ansicht: bind(PagePresenter.MyView.class).to(PageViewTablet.class);

bindPresenterWidget tatsächlich Aufrufe bind(PagePresenter.class). Dann werden Bindungen aufgelöst, und da Sie keine Konstante für eine mit annotierte Ganzzahl haben, wird sie ausgelöst.

Wenn immer nur eine Seite sichtbar ist, können Sie auch einen URL-Parameter zum Speichern der Seitenzahl verwenden. Dann können Sie onReset() überschreiben und den Inhalt basierend auf der angeforderten Seite aktualisieren. Diese Technik würde es vermeiden, mehrere PagePresenter zu instanziieren, und Sie können unterstützte Fabriken loswerden.

+0

Vielen Dank Christopher. Ich war wirklich festgefahren. Jetzt verstehe ich warum, aber woooh, ich war wirklich weit davon entfernt, die Lösung zu finden. Und für das Protokoll, nein, ich werde das ganze Buch auf dem Bildschirm anzeigen (oder zumindest mit einem verzögerten Laden wie unendliches Scrollen), und für das, was ich verstehe, scheint es eine gute Sache zu sein, die entsprechenden PagePresenters on the fly zu instantiieren. –