3

イベントバスをコンポーネントに挿入しようとしていますが、「デフォルト(引数がゼロ)のコンストラクターがありません」というメッセージが表示されます。エラー。私が間違っていることの手がかりはありますか?GINは非常に新しいので、些細なことかもしれません。

これが私のコードです:

モジュール:

public class MyWidgetClientModule extends AbstractGinModule { 
    protected void configure() { 
        bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class); 
    } 
} 

インジェクター:

@GinModules(MyWidgetClientModule.class) 
public interface MyWidgetGinjector extends Ginjector { 

} 

そして私が注入しようとしているコンポーネント:

public class I18NLabel extends Label implements ChangeLanguageEventHandler{ 

  private final SimpleEventBus eventBus; 
    private String key; 

    @Inject 
    public I18NLabel(SimpleEventBus eventBus) { 
        this.eventBus = eventBus; 
    } 
... 

このエラーログが表示されます。

00:00:45.767  [DEBUG] Rebinding com.test.fdc.gui.gwt.client.customer.CustomerDetailView.Binder
00:00:45.767  [DEBUG] Invoking generator com.google.gwt.uibinder.rebind.UiBinderGenerator
00:00:45.767  [ERROR] com.test.fdc.gui.gwt.client.content.i18n.I18NLabel has no default (zero args) constructor. To fix this, you can define a @UiFactory method on the UiBinder's owner, or annotate a constructor of I18NLabel with @UiConstructor.
00:00:45.767  [ERROR] Deferred binding failed for 'com.test.fdc.gui.gwt.client.customer.CustomerDetailView.Binder'; expect subsequent failures

00:00:45.767  [ERROR] Uncaught exception escaped
java.lang.ExceptionInInitializerError:null
    com.test.fdc.gui.gwt.client.FDC $ 4.onSuccess(FDC.java:394)で
    com.test.fdc.gui.gwt.client.FDC $ 4.onSuccess(FDC.java:1)で
    com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:215)で
    com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)で
    com.google.gwt.http.client.RequestBuilder $ 1.onReadyStateChange(RequestBuilder.java:395)で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
    java.lang.reflect.Method.invoke(Method.java:597)で
    com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)で
    com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)で
    com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)で
    com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326)で
    com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207)で
    com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)で
    com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:562)で
    com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)で
    com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)で
    com.google.gwt.core.client.impl.Impl.apply(Impl.java)で
    com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214)で
    sun.reflect.GeneratedMethodAccessor22.invoke(不明なソース)で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
    java.lang.reflect.Method.invoke(Method.java:597)で
    com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)で
    com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)で
    com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)で
    com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)で
    com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)で
    com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)で
    java.lang.Thread.run(Thread.java:619)で
原因:java.lang.RuntimeException:'com.test.fdc.gui.gwt.client.customer.CustomerDetailView $ Binder'の遅延バインディングが失敗しました(必要なモジュールを継承するのを忘れましたか?)
    com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:53)で
    com.google.gwt.core.client.GWT.create(GWT.java:97)で
    com.test.fdc.gui.gwt.client.customer.CustomerDetailView。(CustomerDetailView.java:34)で
    com.test.fdc.gui.gwt.client.FDC $ 4.onSuccess(FDC.java:394)で
    com.test.fdc.gui.gwt.client.FDC $ 4.onSuccess(FDC.java:1)で
    com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:215)で
    com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)で
    com.google.gwt.http.client.RequestBuilder $ 1.onReadyStateChange(RequestBuilder.java:395)で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
    java.lang.reflect.Method.invoke(Method.java:597)で
    com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)で
    com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)で
    com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)で
    com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326)で
    com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207)で
    com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)で
    com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:562)で
    com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)で
    com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)で
    com.google.gwt.core.client.impl.Impl.apply(Impl.java)で
    com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214)で
    sun.reflect.GeneratedMethodAccessor22.invoke(不明なソース)で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
    java.lang.reflect.Method.invoke(Method.java:597)で
    com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)で
    com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)で
    com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)で
    com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)で
    com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)で
    com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)で
    java.lang.Thread.run(Thread.java:619)で
原因:com.google.gwt.core.ext.UnableToCompleteException :(以前のログエントリを参照)
    com.google.gwt.dev.shell.ModuleSpace.rebind(ModuleSpace.java:596)で
    com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:456)で
    com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:49)で
    com.google.gwt.core.client.GWT.create(GWT.java:97)で
    com.test.fdc.gui.gwt.client.customer.CustomerDetailView。(CustomerDetailView.java:34)で
    com.test.fdc.gui.gwt.client.FDC $ 4.onSuccess(FDC.java:394)で
    com.test.fdc.gui.gwt.client.FDC $ 4.onSuccess(FDC.java:1)で
    com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:215)で
    com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)で
    com.google.gwt.http.client.RequestBuilder $ 1.onReadyStateChange(RequestBuilder.java:395)で
    sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
    java.lang.reflect.Method.invoke(Method.java:597)で
    com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)で
    com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)で
    com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)で
    com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326)で
    com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207)で
    com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:126)で
    com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:562)で
    com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)で
    com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)で
    com.google.gwt.core.client.impl.Impl.apply(Impl.java)で
    com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214)で
    sun.reflect.GeneratedMethodAccessor22.invoke(不明なソース)で
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)で
    java.lang.reflect.Method.invoke(Method.java:597)で
    com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)で
    com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)で
    com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)で
    com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)で
    com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)で
    com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)で
    java.lang.Thread.run(Thread.java:619)で
4

3 に答える 3

3

UiBinder でウィジェットを宣言すると、GWT はデフォルトのゼロ引数コンストラクターでウィジェットをインスタンス化しようとします。新しいウィジェットには引数なしのコンストラクタがないため、UiBinder メソッドは失敗します

@UiConstructor および @UiField(provided=true) アノテーションを調べることができますが、どちらもこれに対する非常に洗練されたソリューションを提供しません。プログラムでウィジェットを宣言し、Java のレイアウトに挿入する方がよい場合があります。UiBinder を使い続けたい場合は、次のようにすることができます。

@UiField(provided=true)
protected I18NLabel theLabel;

public MyCompositeWidgetDefinedByUiBinder()
{
   theLabel = new I18NLabel(eventBusToInject);
   initWidget(uiBinder.createAndBindUI(this));
}

しかし、これ以外に UiBinder を介してオブジェクトを挿入するエレガントな方法はありません。

于 2010-11-01T19:26:04.523 に答える
2

おそらくこれは少し遅れていますが、インターフェースではなく実装を注入していました。SimpleEventBus の代わりに EventBus を注入してみてください。モジュールにバインドされているため、GINは正しいものを使用することを認識します。

于 2011-01-18T11:05:19.123 に答える
1

SimpleEventBusゼロ引数のコンストラクターがないと思いますか? そのため、Gin はその方法 (どの引数を使用するか) がわからないため、インスタンス化できません。

この場合、これを に追加しMyWidgetClientModuleます。

// assuming you only need one event bus in whole app
// use appropriate "args.." 
private static final SimpleEventBus eventBus = new SimpleEventBus(args..);

@Provides
SimpleEventBus provideEventBus() {
    return eventBus;
}
于 2010-11-01T16:45:48.537 に答える