2016-04-20 2 views
0

J'ai déjà utilisé l'injection assistée par Gin plusieurs fois mais je suis nouveau sur gwtp et je suis confronté à un message d'erreur que je ne comprends pas en essayant d'instancier un PresenterWidget en utilisant mon usine, même après avoir lu plusieurs messages sur le sujet ...Erreur d'injection assistée lors de la création du présentateur

[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)] 

Contexte: Je dois afficher le contenu d'un livre à l'écran. Pour le moment j'utilise un BookPresenter avec proxy et place et je vais essayer de lier/délier des pages à la volée en tant que PresenterWidget. Je ne pense pas que mes pages pourraient être implémentées en tant que CellWidget parce que je vais implémenter beaucoup de fonctionnalités DTP/WYSIWYG.

Mon Module:

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 et usine:

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

C'est peut-être une erreur très stupide puisque je ne vois pas ce que je fais de différent de tous les autres posts sur le même sujet ...

Répondre

1

Si vous voulez utiliser l'injection assistée ici, n'appelez pas bindPresenterWidget(PagePresenter.class, PagePresenter.MyView.class, PageViewTablet.class); directement. Au lieu de cela, lier uniquement la vue: bind(PagePresenter.MyView.class).to(PageViewTablet.class);

bindPresenterWidget appelle effectivement bind(PagePresenter.class). Puis les liaisons sont résolues et puisque vous n'avez pas de constante pour un entier annoté avec @Assisted, il se lance.

Si vous n'avez qu'une seule page visible à la fois, vous pouvez également utiliser un paramètre d'URL pour stocker le numéro de page. Ensuite, vous pouvez remplacer onReset() et mettre à jour le contenu en fonction de la page demandée. Cette technique évite d'instancier plusieurs PagePresenter et vous pouvez vous débarrasser des usines assistées.

+0

Merci beaucoup Christopher. J'étais vraiment coincé avec. Maintenant, je comprends pourquoi mais woooh, j'étais vraiment loin de trouver la solution. Et pour mémoire, non, je vais afficher le livre entier sur l'écran (ou au moins en utilisant un chargement différé comme le défilement infini), et pour ce que je comprends, il semble bon d'instancier les PagePresenters correspondants à la volée. –