2011-01-17 4 views
1

GWTのサーバ側コード(通常のサーバコードなど)からGWT「サーブレット」サイドコード)、具体的にはRemoteServiceServletサーブレット属性(サーバ側)または「依存性注入」を介してGWTサーブレットにオブジェクトを渡す

私のGWTサーバ側のコードは、RPC型のRemoteServiceServletで構成されているため、参照を取得できないように見えるので、テストモードで実際の/偽のオブジェクトを渡すことはできません。私はGWTが内部で深くインスタンス化するように見えるので、サーバーオブジェクトへのアクセス権がないのでオブジェクトを単に渡す方法はありません(依存性注入スタイル)。

P.S.私はGIN/Juiceのような本格的なDIフレームワークを使いたくはありません。私は、GWTサーブレットのインスタンスにアクセスし、それに情報を渡す方法がほしいです。

答えて

1

サーブレットコンテナは、ホストするサーブレットに直接アクセスできないように設計されています。サーブレットに何らかのハンドルを持たせるのが難しいことが分かったのです。

代わりに、現在サーブレットにあるコードを別のリクエストハンドラクラスにリファクタリングし、serlvetsを呼び出すようにしてください。

テスト目的のために、テストフレームワークまたはクライアントコードをリクエストハンドラクラスに直接フックできます。それは、人々があなたが苦しんできた問題を一般的に解決する方法です。

+0

ええと、通常のTomcatのようなサーブレットコンテナでは、サーブレット(またはハンドラ)を自分でインスタンス化してからサーバーに追加することができます。つまり、いくつかのグローバルサービスを渡すことができます。私はGWTサーブレットと同じことを探しています。 – AshirusNW

+0

これは本当に私の質問に答えるものではありません。 – AshirusNW

2

まだ始まっていない場合は、this Google I/O presentation on GWT Architecture best practicesをご覧になることをお勧めします。私はそれが非常に有用であると分かりました。そして、それは次のものの大部分がどこから来たかです。

GWTのRemoteServiceServletを拡張する抽象的な「ディスパッチ」サーブレットを作成しました。私が持っているすべてのモジュールには、リクエストハンドラのセットを登録するサービスが1つしかありません(抽象ディスパッチサービスを拡張します)。与えられたGWTモジュールのすべてのGWTサービスコールは、そのモジュールのディスパッチサービスに入ります。ディスパッチサービスは、要求のタイプを調べ、適切なリクエストハンドラにディスパッチします。要求ハンドラは、実際にはサービスサーブレットに以前に存在していた作業を処理します。 web.xmlに登録するサーブレットの数を減らすことで、GWTが必要とする余分なインターフェイスを避けることはもちろん、実際のディスパッチをすべて処理するディスパッチャオブジェクトをより簡単に制御できます。たとえば、Webコンテナではなくあなたがインスタンス化を担当しているので、これらのリクエストハンドラに好きなリアル/モックオブジェクトを渡すことができます。

私は自分自身を転がしましたが、この目的のためにgwt-dispatchプロジェクトが存在します。

これが役に立ちます。

+0

これは実際に私の質問に答えるのではないかと恐れています。 GWTサーブレットのハンドルを取得する方法を具体的に知りたい。彼らは孤立して存在し、GWTの腸の深部で具体化されているようで、私は何も渡すことができません。 – AshirusNW

+0

リンク先の話は、クライアントサイドのDIを行う方法を示していますが、クライアント側ではエントリーポイントがありますので、クライアントサイドのコードにすべて渡すことができます。私がすべてのサーブレットをインスタンス化して、好きなものを渡すことができるエントリポイント。 – AshirusNW

+0

GWTサーブレットのコードをリクエストハンドラに移動することは、直接あなたにはまったく正確なものではありません。これらのリクエストハンドラは、サーブレットを扱う必要がないように操作することができます(サーブレットコンテナでは、あなたが望むようにサーブレットコンテナを実際に取得することはできません)。 – Tony