[Seasar-user:17305] [S2Click]S2Clickでセッションからオブジェクトを取得するとキャストエラーとなります。

イマム [E-MAIL ADDRESS DELETED]
2009年 4月 24日 (金) 13:26:10 JST


こんにちは、今村と言います。

現在、S2Clickにていろいろ調査を行っているのですが、
セッションからオブジェクトを取得するときに設定したオブジェクトのクラスを指定しているにも関わらず、
ClassCastExceptionが発生してしまい、原因がわからずに困っています。

実装内容は、以下のようになります。
1.IndexPageにてセッションにオブジェクトを設定し、
    その後、Index2Pageにリダイレクトします。
2.遷移先のIndex2Pageにて1.で設定したオブジェクトをセッションから取得します。
     ↓
ここでClassCastExceptionが発生します。

私の環境に依存している問題なのかもしれませんが、
何かお気づきの方がいらっしゃいましたら、
ご教授お願いいたします。

※以下のソースはS2Click 0.5.0に付属するblankプロジェクトのソースをもとに作成しています。

●環境
---------------------------------------------------------------
Java  1.5.0_16
S2Click 0.5.0
Tomcat 5.5.26
---------------------------------------------------------------

●IndexPage
---------------------------------------------------------------
public class IndexPage extends Page {
    public IndexForm form = new IndexForm("form");
    public IndexPage(){
        form.submit.setListener(this, "doAdd");
    }
    public boolean doAdd(){
        if(form.isValid()){
            form.result.setValue(String.valueOf(
                    form.num1.getInteger() + form.num2.getInteger()));
        }
        TestData testData = new TestData();
        testData.result = form.result.getValue();
        getContext().setSessionAttribute("INFO_KEY", testData);
        setRedirect(Index2Page.class);
        return true;
    }
}
---------------------------------------------------------------

●Index2Page
---------------------------------------------------------------
public class Index2Page extends Page {
    public Index2Form form = new Index2Form("form");
    public Index2Page(){
        form.submit.setListener(this, "doAdd");
        TestData testData =
(TestData)getContext().getSessionAttribute("INFO_KEY"); // ここでエラー
        form.result.setValue(testData.result);
    }
    public boolean doAdd(){
        if(form.isValid()){
            form.result.setValue(String.valueOf(
                    form.num1.getInteger() + form.num2.getInteger()));
        }
        return true;
    }
}
---------------------------------------------------------------

●TestData
---------------------------------------------------------------
public class TestData {
    public String result;
}
---------------------------------------------------------------

●エラー時のスタックトレース
---------------------------------------------------------------
[Click] [error] handleException: java.lang.RuntimeException:
org.seasar.framework.exception.InvocationTargetRuntimeException:
[ESSR0043]org.seasar.s2click.example.page.Index2Page$$EnhancedByS2AOP$$10e6cbdが呼び出した対象が不正です。理由はjava.lang.ClassCastException:
org.seasar.s2click.example.TestData
	at net.sf.click.ClickServlet.initPage(ClickServlet.java:1053)
	at net.sf.click.ClickServlet.createPage(ClickServlet.java:868)
	at net.sf.click.ClickServlet.handleRequest(ClickServlet.java:345)
	at net.sf.click.ClickServlet.doGet(ClickServlet.java:284)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at net.sf.click.S2ClickServlet.service(S2ClickServlet.java:78)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:63)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.seasar.s2click.filter.S2ClickEncodingFilter.doFilter(S2ClickEncodingFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:595)
Caused by: org.seasar.framework.exception.InvocationTargetRuntimeException:
[ESSR0043]org.seasar.s2click.example.page.Index2Page$$EnhancedByS2AOP$$10e6cbdが呼び出した対象が不正です。理由はjava.lang.ClassCastException:
org.seasar.s2click.example.TestData
	at org.seasar.framework.util.ConstructorUtil.newInstance(ConstructorUtil.java:65)
	at org.seasar.framework.container.assembler.AbstractConstructorAssembler.assembleDefault(AbstractConstructorAssembler.java:115)
	at org.seasar.framework.container.assembler.AutoConstructorAssembler.doAssemble(AutoConstructorAssembler.java:44)
	at org.seasar.framework.container.assembler.AbstractConstructorAssembler.assemble(AbstractConstructorAssembler.java:55)
	at org.seasar.framework.container.deployer.RequestComponentDeployer.deploy(RequestComponentDeployer.java:65)
	at org.seasar.framework.container.impl.ComponentDefImpl.getComponent(ComponentDefImpl.java:111)
	at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:129)
	at net.sf.click.S2ClickServlet.newPageInstance(S2ClickServlet.java:92)
	at net.sf.click.ClickServlet.initPage(ClickServlet.java:1005)
	... 29 more
Caused by: java.lang.ClassCastException: org.seasar.s2click.example.TestData
	at org.seasar.s2click.example.page.Index2Page.<init>(Index2Page.java:18)
	at org.seasar.s2click.example.page.Index2Page$$EnhancedByS2AOP$$10e6cbd.<init>(Index2Page$$EnhancedByS2AOP$$10e6cbd.java)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
	at org.seasar.framework.util.ConstructorUtil.newInstance(ConstructorUtil.java:57)
	... 37 more


Seasar-user メーリングリストの案内