2010年5月9日日曜日

jsp サーブレット間の通信、session attributeについて

GAEでsessionのattributeを利用するときの注意。

ローカルではエラーがなく動きましたが、デプロイするとエラーがでることが出る。
エラーの内容は、
java.lang.RuntimeException: java.io.NotSerializableException: クラス名
なエラーです。


原因はSessionに対してsetAttributeしたときに、対象のクラスがシリアル化されていない場合にローカルではなんとなく動くようですが、デプロイ後は上記のエラーが発生する模様です。


シリアル化されているかどうかのポイントは
・ implements Serializable をクラスに対してつけているか
・private static final long serialVersionUID = 1L;を宣言しているかどうか
・全てのメンバーに対してgetter,setterがあること。
だそうです・・・

以下、対応したソースです。




  1. package xxxxx;  
  2. import java.io.Serializable;  
  3. //①implements Serializableが必要  
  4. public class WordScore implements Serializable {  
  5.     //②serialVersionUIDが必要  
  6.     private static final long serialVersionUID = 1L;   
  7.       
  8.     private String word="";  
  9.     private String score = "";  
  10.   
  11.     private static Random rnd;  
  12.   
  13.     //③Setter、Getterの宣言  
  14.     public WordScore() {  
  15.     }  
  16.     public WordScore(String word,String score) {  
  17.         this.word = word;  
  18.         this.score = score;  
  19.     }  
  20.     public Integer getScoreInt(){  
  21.         return Integer.parseInt(score);  
  22.     }  
  23.     public String getScore() {  
  24.         return score;  
  25.     }  
  26.     public void setScore(String score) {  
  27.         this.score = score;  
  28.     }  
  29.     public String getWord() {  
  30.         return word;  
  31.     }  
  32.     public void setWord(String word) {  
  33.         this.word = word;  
  34.     }  
  35. }  


あと、シリアル化失敗した状態で、GAEデプロイしてしまった後、なぜかバージョンあげるまで正常に動かない状態がありました。
デプロイ時のバージョンあげれば解決しました。
変なシリアル化された情報がサーバー上にのこっていたのかなと推測・・・

0 件のコメント :

コメントを投稿