- PR -

sessionに格納時のエラーについて

投稿者投稿内容
まろにえ
会議室デビュー日: 2007/06/11
投稿数: 12
お住まい・勤務地: 東京
投稿日時: 2007-07-20 12:58
お世話になります。

Eclipse3.2
JDK5.0

現在、sessionにフォームBeanを格納し、JSPで表示させようとしています。
以下のように書いてみました。
しかし、実行すると1回目は正常に動作するのですが、2回目再度実行するとキャスト関連のエラーが出てしまいます。work内を消して、Tomcatを再起動してから実行するとやはり2回目に同じエラーが出てしまいます。requestのときは問題ありませんでした。
キャスト関連は大丈夫なように見えるのですが…

このエラーは何故2回目以降発生してしまうのでしょうか。
ご協力よろしくお願い致します。
-----------------------------------
エラー
java.lang.ClassCastException: java.util.ArrayList
org.apache.struts.util.RequestUtils.lookupActionForm(RequestUtils.java:213)
org.apache.struts.util.RequestUtils.createActionForm(RequestUtils.java:179)
org.apache.struts.action.RequestProcessor.processActionForm(RequestProcessor.java:331)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:202)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

-----------------------------------
アクション
HttpSession session = req.getSession();
Connection con = getConnection();
Statement smt = con.createStatement();
ResultSet rs = smt.executeQuery("select mkr,mkna from mkm");

List list = new ArrayList();
while (rs.next()) {
TopForm top = new TopForm();
top.setMkr(rs.getString("mkr"));
top.setMkna(rs.getString("mkna"));
list.add(top);
session.setAttribute("TopForm", list);
}
smt.close();
con.close();
return mapping.findForward("top");
}
-----------------------------------
フォーム
private String MKR;
private String MKNA;

public void setMkna(String MKNA) {
this.MKNA = MKNA; }
public String getMkna() {
return MKNA;}
public void setMkr(String MKR) {
this.MKR = MKR;}
public String getMkr() {
return MKR;}
-----------------------------------
struts-config.xml
<form-beans>
<form-bean name="TopForm" type="form.TopForm"/>
</form-beans>
<action-mappings>
<action path="/top" name="TopForm" type="action.TopAction" scope="session">
<forward name="top" path="/top.jsp"/>
</action>
-----------------------------------
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-20 13:32
HttpSessionを使うと連続したブラウザ操作に対してオブジェクトを保持することが出来ます。
前回の操作でputした型とgetしてキャストしたときの型が違えば当然ClassCastExceptionが発生します。

エラーの行数が提示のソースのどこにあたるのか分かりませんが、
該当位置での実際のオブジェクトの型を確認すれば原因がつかめることでしょう。

ブレークポイントを張って、変数の具象型を確認するとか、
System.out.printlnするでも構いません。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-07-20 14:19
1回めはnullだから発生しないとか。
まろにえ
会議室デビュー日: 2007/06/11
投稿数: 12
お住まい・勤務地: 東京
投稿日時: 2007-07-20 14:50
絞っていったら、やっぱり以下のどこかに原因があるようです。

以下の一行目を下のように変更して、違う型にならないようにしたけど現象は同じでした。
List<TopForm> list = new ArrayList<TopForm>();
-----------------------------------------
アクション
 List list = new ArrayList();
 while (rs.next()) {
  TopForm top = new TopForm();
  top.setMkr(rs.getString("mkr"));
  top.setMkna(rs.getString("mkna"));
  list.add(top);
 session.setAttribute("TopForm", list);
 }
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2007-07-20 15:26
Strutsには明るくないので、スタックトレースを眺めて思っただけですが、
引用:

java.lang.ClassCastException: java.util.ArrayList
org.apache.struts.util.RequestUtils.lookupActionForm(RequestUtils.java:213)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


とあるので、StrutsがTopFormというアクションフォーム(?)を
セッションから取得しようとしてみたら、ArrayListが取れてしまった

ってことでは?
一回目はそもそもセッションにセットされてないので、問題がないように見える・・・とか。

アクションでは、
引用:

List list = new ArrayList();
while (rs.next()) {
TopForm top = new TopForm();
top.setMkr(rs.getString("mkr"));
top.setMkna(rs.getString("mkna"));
list.add(top);
session.setAttribute("TopForm", list);
}


このように、ArrayListのインスタンスをTopFormという名前でsetAttributeしてますよね。

#というか、ループの中で何度もsetAttributeしてるのもおかしい気が・・・
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-07-20 15:27
ClassCastExceptionが発生するのは、大抵setするときではなくgetするときですよ。

[ メッセージ編集済み 編集者: mio 編集日時 2007-07-20 15:28 ]
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-07-20 16:00
エラーが出る画面用のフォームBeanって、"TopForm"で、こういった
コード:
<bean:write name="TopForm" property="..." />


記述がされていたりしませんかね?。

初回アクセス
 application -> pageの順にTopFormを探しても見つからないから影響無し
二回目のアクセス
 sessionスコープでTopFormが見つかったが、propertyで指定されたゲッターメソッド
が無い、というかクラス型自体違うということでClassCastExceptionが発生

というような。
ただ、タグライブラリ処理で例外が出た場合は、jspをサーブレット化した
内部クラス名が出てくるので、別の理由かもしれないと思っています。

まろにえ
会議室デビュー日: 2007/06/11
投稿数: 12
お住まい・勤務地: 東京
投稿日時: 2007-07-20 16:11
すみませんJSPを記述するのを忘れてました。
ここでgetした時にエラーが出てるんでしょうか…
------------------------------------------------------------------
JSP
<table>
<logic:iterate id="data" name="TopForm" scope="session" >
<tr>
<td><bean:write name="data" property="mkr" /></td>
<td><bean:write name="data" property="mkna"/></td>
</tr>
</logic:iterate>
</table>

スキルアップ/キャリアアップ(JOB@IT)