- - PR -
sessionに格納時のエラーについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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> ----------------------------------- | ||||||||
|
投稿日時: 2007-07-20 13:32
HttpSessionを使うと連続したブラウザ操作に対してオブジェクトを保持することが出来ます。
前回の操作でputした型とgetしてキャストしたときの型が違えば当然ClassCastExceptionが発生します。 エラーの行数が提示のソースのどこにあたるのか分かりませんが、 該当位置での実際のオブジェクトの型を確認すれば原因がつかめることでしょう。 ブレークポイントを張って、変数の具象型を確認するとか、 System.out.printlnするでも構いません。 | ||||||||
|
投稿日時: 2007-07-20 14:19
1回めはnullだから発生しないとか。
| ||||||||
|
投稿日時: 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); } | ||||||||
|
投稿日時: 2007-07-20 15:26
Strutsには明るくないので、スタックトレースを眺めて思っただけですが、
とあるので、StrutsがTopFormというアクションフォーム(?)を セッションから取得しようとしてみたら、ArrayListが取れてしまった ってことでは? 一回目はそもそもセッションにセットされてないので、問題がないように見える・・・とか。 アクションでは、
このように、ArrayListのインスタンスをTopFormという名前でsetAttributeしてますよね。 #というか、ループの中で何度もsetAttributeしてるのもおかしい気が・・・ | ||||||||
|
投稿日時: 2007-07-20 15:27
ClassCastExceptionが発生するのは、大抵setするときではなくgetするときですよ。[ メッセージ編集済み 編集者: mio 編集日時 2007-07-20 15:28 ] | ||||||||
|
投稿日時: 2007-07-20 16:00
エラーが出る画面用のフォームBeanって、"TopForm"で、こういった
記述がされていたりしませんかね?。 初回アクセス application -> pageの順にTopFormを探しても見つからないから影響無し 二回目のアクセス sessionスコープでTopFormが見つかったが、propertyで指定されたゲッターメソッド が無い、というかクラス型自体違うということでClassCastExceptionが発生 というような。 ただ、タグライブラリ処理で例外が出た場合は、jspをサーブレット化した 内部クラス名が出てくるので、別の理由かもしれないと思っています。 | ||||||||
|
投稿日時: 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> |