Spring 中未发现 @Inject 或默认构造函数错误

No @Inject or default constructor found error in Spring

我的代码相当简单,由 Eclipse 生成。

public class BuchAnalysisPresenter extends
            Presenter<BuchAnalysisPresenter.MyView, BuchAnalysisPresenter.MyProxy>
            implements BuchAnalysisUiHandlers {
        interface MyView extends View, HasUiHandlers<BuchAnalysisUiHandlers> {

            SimplePanel getMain();
        }

        @ContentSlot
        public static final Type<RevealContentHandler<?>> SLOT_BUCHNR = new Type<RevealContentHandler<?>>();

        @NameToken(NameTokens.buchnummer)
        @ProxyStandard
        interface MyProxy extends ProxyPlace<BuchAnalysisPresenter> {
        }

        @Inject
        VerlagServiceAsync verlagServiceAsync;

        @Inject
        BuchAnalysisPresenter(EventBus eventBus, MyView view, MyProxy proxy) {

            super(eventBus, view, proxy, HomePagePresenter.SLOT_SetGraphContent);
            getView().setUiHandlers(this);
        }
    }

但是我得到一个编译错误:

Unable to create or inherit binding: No @Inject or default constructor found for de.it2media.dps.statistics.client.application.buchnranalysis.BuchAnalysisPresenter$MyView

正如您在代码中看到的那样,实际上有一个构造函数 BuchAnalysisPresenter 以及带有它的 @Inject 注释。

我是 Spring 的新手,不知道为什么会这样。

您是否在上下文中定义了 MyView 类型的 bean?如果不是,Spring 将尝试实例化一个,这将不适用于接口。

2 种可能的解决方法:

  1. 在 Spring 上下文中定义正确类型的 bean
  2. 更改构造函数参数的类型:

    BuchAnalysisPresenter(EventBus eventBus, MyViewImpl view, MyProxy proxy)
    

我找到了解决方案。我只需要调用 GinBinderinstall() 方法并像这样初始化我的模块 BuchAnalysisModule 。无需其他更改。

public class ApplicationModule extends AbstractPresenterModule {
@Override
protected void configure() {
    install(new BuchAnalysisModule());

    bindPresenter(ApplicationPresenter.class,
                ApplicationPresenter.MyView.class, ApplicationView.class,
                ApplicationPresenter.MyProxy.class);
    }
}

在我的例子中,问题是我在 View class 中使用了错误的 HashMap 实现,如下所示:

Map<String, String> map = new HashMap<String, String>();

The issue was with imported classes

我导入的 Map 接口是正确的,但是 HashMap 是错误的 class

导入如下:

import java.util.Map;
import com.google.gwt.dev.util.collect.HashMap;

我用以下内容替换了 HashMap,它起作用了:)

import java.util.HashMap;