3

Injecton変数を使用すると少し迷います。

私はこのコードを機能させました:

private XXServiceAsync xxServiceAsync;

@Inject
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) {
    super(eventBus, mapper);

    this.xxServiceAsync = xxServiceAsync;
    initializeWidgets();
}

このコードを使用すると、クラス内の必要な場所でRPCサービスを呼び出すことができます(クリックすると...)変数に直接挿入してコードを少しクリアしたいと思います。そうする :

@Inject
private XXServiceAsync xxServiceAsync;


protected IndexViewImpl(EventBus eventBus) {
    super(eventBus, mapper);
    initializeWidgets();
}

これにより、サービスは常にNULLに保たれます。私は何か間違ったことをしていますか?rpcサービスを使用したGINマジックは、他の方法で実行することを目的としていますか?

ありがとう!

4

2 に答える 2

5

Gin(およびGuice、およびこのような他のフレームワーク)は、コンストラクターの実行が終了するまでフィールドを割り当てることができないため、その時点ではまだnullです。

コードを手動で配線した場合、これがどのように見えるかを検討してください(Gin / Guiceはプライベートフィールドを割り当てるために少しごまかし、非表示のメソッドを呼び出すことに注意してください)。

MyObject obj = new MyObject();//initializeWidgets() runs, too early!
obj.xxServiceAsync = GWT.create(xxService.class);

コンストラクターに何かが必要な場合は、それをコンストラクターに渡します。すぐに必要にならない場合(asWidget()が呼び出されるまでなど)、@Injectで注釈が付けられたフィールドまたはセッターが役立ちます。

于 2012-02-20T17:57:57.943 に答える
0

フィールドレベルのインジェクションがある場合は、空の@Injectメソッドを使用して、インジェクト後の初期化を行うことができます。クラスへのフィールドインジェクションが完了した後、引数なしのインジェクトメソッドが実行されます。

@Inject void initialize(){
  ...
  initializeWidgets()
}

編集:メソッドインジェクションの後にも実行されたと以前に述べましたが、テストでは、これが常に当てはまるとは限らないことが示されています。

于 2012-02-21T01:20:12.087 に答える