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 种可能的解决方法:
- 在 Spring 上下文中定义正确类型的 bean
更改构造函数参数的类型:
BuchAnalysisPresenter(EventBus eventBus, MyViewImpl view, MyProxy proxy)
我找到了解决方案。我只需要调用 GinBinder
的 install()
方法并像这样初始化我的模块 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;
我的代码相当简单,由 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 种可能的解决方法:
- 在 Spring 上下文中定义正确类型的 bean
更改构造函数参数的类型:
BuchAnalysisPresenter(EventBus eventBus, MyViewImpl view, MyProxy proxy)
我找到了解决方案。我只需要调用 GinBinder
的 install()
方法并像这样初始化我的模块 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;