【问题标题】:Assisted injection error while trying to create presenter尝试创建演示者时出现辅助注入错误
【发布时间】:2016-04-20 14:56:58
【问题描述】:

我已经使用过几次 Gin 辅助注射,但我是 gwtp 的新手,并且在尝试使用我的工厂实例化 PresenterWidget 时遇到了我不理解的错误消息,即使在阅读了有关该主题的几篇帖子之后也是如此...

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

上下文:我必须在屏幕上显示一本书的内容。目前,我使用带有代理和位置的 BookPresenter,我将尝试作为 PresenterWidget 即时绑定/取消绑定页面。我不认为我的页面可以实现为 CellWidget,因为我将实现许​​多 DTP / WYSIWYG 功能。

我的模块:

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 和工厂:

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

这可能是一个非常愚蠢的错误,因为我看不出我所做的与同一主题的所有其他帖子有何不同...

【问题讨论】:

    标签: java gwt gwtp gwt-platform gwt-gin


    【解决方案1】:

    如果你想在这里使用辅助注射,请不要直接拨打bindPresenterWidget(PagePresenter.class, PagePresenter.MyView.class, PageViewTablet.class);。相反,只绑定视图:bind(PagePresenter.MyView.class).to(PageViewTablet.class);

    bindPresenterWidget 实际上调用了bind(PagePresenter.class)。然后绑定被解析,因为你没有用 @Assisted 注释的整数的常量,它会抛出。

    如果您一次只能看到一个页面,您还可以使用 URL 参数来存储页码。然后您可以覆盖onReset() 并根据请求的页面更新内容。这种技术将避免实例化多个 PagePresenter 并且您可以摆脱辅助工厂。

    【讨论】:

    • 非常感谢克里斯托弗。我真的被困住了。现在我明白了为什么,但是哇,我离找到解决方案还差得很远。为了记录,不,我将在屏幕上显示整本书(或者至少使用像无限滚动这样的延迟加载),据我所知,动态实例化相应的 PagePresenter 似乎是件好事。跨度>
    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多