RPCサービスの変数のgin @Inject
-
28-10-2019 - |
質問
私は変数に注入を使用して少し迷子になります。
私はこのコードを動作させました:
private XXServiceAsync xxServiceAsync;
@Inject
protected IndexViewImpl(EventBus eventBus, XXServiceAsync tableManagementServiceAsync) {
super(eventBus, mapper);
this.xxServiceAsync = xxServiceAsync;
initializeWidgets();
}
このコードを使用すると、クラスの必要な場所にRPCサービスに電話することができます(クリックして...)変数にDireclyを注入してコードを少しクリアしたいと思います。そうする :
@Inject
private XXServiceAsync xxServiceAsync;
protected IndexViewImpl(EventBus eventBus) {
super(eventBus, mapper);
initializeWidgets();
}
これにより、常にサービスをnullに保ちます。私は何か間違ったことをしていますか? RPCサービスを備えたジンマジックは、それ以外の場合は行われることを意図していますか?
ありがとう!
解決
Gin(およびGuice、およびこのような他のフレームワーク)がコンストラクターの実行が終了するまでフィールドを割り当てることができないため、その時点ではまだnullです。
コードを手動で配線している場合、これがどのように見えるかを考えてください(GIN/GUICEがプライベートフィールドを割り当てるために少しcheTすることを忘れないでください。
MyObject obj = new MyObject();//initializeWidgets() runs, too early!
obj.xxServiceAsync = GWT.create(xxService.class);
コンストラクターに何かが必要な場合は、コンストラクターに渡します。すぐに必要な場合(Aswidget()が呼び出されるまで)、 @Injectで注釈付けされたフィールドまたはセッターが役立ちます。
他のヒント
フィールドレベルのインジェクションがある場合は、空の@Injectメソッドを使用して、インジェック後の初期化を行うことができます。クラスでのフィールドインジェクションが完了した後、NO-ARG注入法は実行されます。
@Inject void initialize(){
...
initializeWidgets()
}
編集:私は以前、メソッドインジェクションの後も実行されたと述べましたが、テストではこれが常に当てはまるわけではないことが示されています。
所属していません StackOverflow