ラベル GWT-RPC の投稿を表示しています。 すべての投稿を表示
ラベル GWT-RPC の投稿を表示しています。 すべての投稿を表示

2012-06-29

GWT:RPCでエラー、its Class object could not be loaded.

GWTのRPCで下記のエラーに遭遇。
Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'XXXXXXXXX' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = XXXXXXXX@d3f8214
ちゃんとSerializeしてるし、変なクラスも呼んでないのにのになんでだろう?と思ったら

  • 引数がゼロのデフォルトコンストラクタを用意しなければならない
という制約があったようですね。今更気づきました。。。(^^ゞ



2012-03-30

GWT:java.lang.NoClassDefFoundError: javax/validation/Path

GWTでRPCプログラムを実行した時に、
[ERROR] javax.servlet.ServletContext log: Exception while dispatching
incoming RPC call
java.lang.NoClassDefFoundError: javax/validation/Path
というエラーがでることがあります。これは、見ての通り
  • javax.validation.Pathクラスがない
っていうことなんですが、これはどのパッケージに含まれているんだろうと、、、実はこういったGWT-RPCに依存しているクラスについては、
  • gwt-servlet-deps.jar
をサーブレットコンテナのクラスパス(/WEB-INF/lib )にいれておけばOKです。


2011-12-27

GWT: Objectifyで得た検索結果をGWT-RPCへ直接送る方法

御存知の通り、GWT-RPCでは送受信するクラスに制約があります。Objectifyで検索をした場合、結果に複数の結果を受け取るときは、QueryクラスやIterableインタフェースで受け取ることになります。この結果をGWT-RPCを利用して直接クライアント側に返す時には、Iterableインタフェース等は送信できないのでようなので、下記のようにリストに変換してから返すことになります。
Query ql = cdao.ofy.query(XXXX.class).filter("key", Key);
List list = ql.list();
return list;


2011-11-19

GWT-RPCでjava.lang.VerifyError

GWT-RPCで下記のようなエラーが出ていた件。
java.lang.VerifyError: Expecting a stackmap frame at branch target 206 in method xxxxxxx(Ljava/lang/String;)Ljava/lang/String; at offset 15
どうやらこれもJDK7が絡んでいる模様。GWT-RPCについてもJDK7は未対応の部分があるようだ。 というわけで、現状では、GWTやGAE系のアプリ開発環境へのJDK7のインストールは控えたほうが良い感じです。

2011-10-13

GWT-RPCでsessionを利用する

GWTはAjaxアプリなので、基本的に画面遷移は存在せず一般的なウェブアプリケーションで求められるサーバ側でのsession管理というものを意識しなくてよい。 しかし、別のアプリケーション(モジュール)への移動といった処理が必要となった場合、サーバ側でのsessionを利用したくなるケースが出てくる。以下はGWT-RPCにおけるsession利用について。

GWT-RPCにおけるサーバ側の処理クラス(~implクラス)の実体はdoGet,doPostといった記述がないだけで、実はServletそのもの。Servletで利用されるHttpServletRequestとかHTTPServletResponseなどは表面上見えないだけで以下のようにして呼び出すことができる。あとは通常のServletと同様の使い方ができると考えてよい。
HttpServletRequest request = this.getThreadLocalRequest();
HTTPSession session = request.getSession();


2011-07-20

EclipseでのGWT-RPCサービスの作り方

GWT-RPCを利用する際には、
  • 「~Service」インタフェース(クライアント側)
  • 「~ServiceAsync」インタフェース(クライアント側)
  • 「~ServiceImpl」クラス(サーバ側)
の3種類が必要ですが、これらを手書きで書くのは面倒です。Eclipseでもそれなりに関連ファイルを自動作成してくれますが、手順が重要です。

各種ファイル生成の手順
  1. プロジェクト名の上で右クリックし、コンテキストメニューを表示します。そこで、【Google Web Tool kit】→【GWT remote service】を選択。
  2. リモートサービス名を入力。「~Service」という名前にするのが流儀っぽい?パッケージ名は、自分がつくっているプロジェクトでのclientパッケージを選択すればよい。
  3. この処理で生成されるのは、クライアント側の「~Service」というインタフェースと、サーバ側の「~ServiceImpl」というクラスだけ。クライアント側で「~Async」インタフェースはできてない。
  4. 「~Service」というインタフェースで「~Async」がないというエラーが出てるので、クリックで生成。必ずインタフェースにしてください。
メソッドの記述
  1. 最初に「~Service」インタフェース(クライアント側)のファイルにメソッドを追記します。
  2. するとエラーがでるので、クリックして「~Async」インタフェースにメソッドを追記するようにします。
  3. 「~ServiceImpl」というクラスのほうでもエラーが出ているので、クリックしてメソッドを実装します。

以上の手順で、記述すべきファイルならびに内容が半自動で用意されます。

2010-03-01

GWT-RPCでの効率的なファイルの記述の仕方

以下の話はNetbeansの場合です。


ご存知のように、GWT-RPCを利用する場合は、3つのファイルが必要になります。(Netbeansの場合は下記のファイルが自動生成されます)


(1)サーバ用サービスインタフェース
(2)クライアント用サービスインタフェース(Asyncで終わる名前のインタフェース)
(3)メソッド実装クラス(Implで終わる名前のクラス)

この3つは関連していますので、3つともメソッドの定義を共通させておく必要があります。しかし、2については微妙に異なっていたりしますので、どうも面倒。。。。Netbeansの場合には、ある程度アシストしてくれますので、次のようにすればOKです。

  1. 最初に(1)にてメソッドを定義
  2. するとエラーができるので、右クリック操作により(2)に自動的にメソッドが定義
  3. つづいて(3)にエラーがでているので、右クリック操作にてメソッドを記述
まあ、しっかり設計していれば必然的にこの順番になるとは思いますが。あと、メソッド名の変更などは、リファクタリングで対応できます。だったら、メソッドの追加も完全に自動対応してくれてもいいような気がしますが、、、、ボクが知らないだけかな?他にいい方法がアルかもしれません。

2009-09-26

GWT-RPCでのAsyncCallbackの書き方考察

GWT-RPCでのクライアント側の処理プログラムの書き方は、正直気持ち悪い。

AsyncCallback callback = new AsyncCallback(){
 @Override
public void onFailure(Throwable caught) {
 results.setText("Server Response Error");
serverResponseLabel.setHTML(caught.getMessage());
}
@Override
public void onSuccess(String result) {
  results.setText(result);
}
};

RS.Method("hello", callback);

サンプルで挙がっているような書き方は、上の書いたように、関数に対応したcallback 変数を定義しているわけだが、これだと関数が増えた時にめんどうだ。どれがどの関数に対応しているのかがわからなくなってしまう。そこで、以下のような書き方にしたほうがいい。

RS.Method(nameField.getText(), new AsyncCallback() {
 public void onFailure(Throwable caught) {
 results.setText("Server Response Error");
 serverResponseLabel.setHTML(caught.getMessage());
}
@Override
public void onSuccess(String result) {
 results.setText(result);
}
});


ま、これは好みの問題かもしれないけどね。

2009-09-25

GWTでのデータクラス設計の際の注意事項

GWT-RPCでは、データの授受を行うデータクラスを定義し、それをサービスメソッドの引数ならびに戻り値に設定することで、複数のデータをまとめて授受することができます。

その際、若干不確定情報がありますが、以下の注意が必要です。
  1. かならずPOJOにしてください
  2. com.google.gwt.user.client.rpc.IsSerializable インターフェースを実装する
  3. アノテーション等の記述はできません
  4. 定義したクラスは、かならずclientパッケージに入れてください。
2と4は重要です。2について補足しますが、例えば以下のようにします。

import com.google.gwt.user.client.rpc.IsSerializable;

public class user implements IsSerializable {

private Integer id;
private String name;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}