[TEEDA-25] STATE_SAVING_METHODがclientの場合にNotSerializableExceptionが発生する Created: 2006-07-29  Updated: 2006-07-29  Resolved: 2006-07-29

Status: Resolved
Project: Teeda
Component/s: Teeda Core
Affects Version/s: 1.0-beta-5
Fix Version/s: 1.0-beta-6

Type: Bug Priority: Major
Reporter: manhole Assignee: manhole
Resolution: Fixed Votes: 0
Labels: None
Environment:

teeda-jsp-example (Revision 1457)



 Description   

teeda-jsp-example (Revision 1457) にてjavax.faces.STATE_SAVING_METHODをclient設定し、
メニューから"converter"リンクをクリックすると例外が発生する。

org.apache.jasper.JasperException: [ESSR0040]IO例外が発生しました。理由はjava.io.NotSerializableException: javax.faces.convert.DateTimeConverter
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:370)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.seasar.teeda.core.util.ServletExternalContextUtil.dispatch(ServletExternalContextUtil.java:122)
    org.seasar.teeda.core.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:110)
    org.seasar.teeda.core.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:185)
    org.seasar.teeda.core.lifecycle.impl.RenderResponsePhase.executePhase(RenderResponsePhase.java:37)
    org.seasar.teeda.core.lifecycle.AbstractPhase.execute(AbstractPhase.java:55)
    org.seasar.teeda.core.lifecycle.LifecycleImpl.render(LifecycleImpl.java:134)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:80)
    org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:63)

原因

org.seasar.framework.exception.IORuntimeException: [ESSR0040]IO例外が発生しました。理由はjava.io.NotSerializableException: javax.faces.convert.DateTimeConverter
    org.seasar.teeda.core.util.ObjectOutputStreamUtil.writeObject(ObjectOutputStreamUtil.java:44)
    org.seasar.teeda.core.render.Base64EncodeConverter.getAsEncodeString(Base64EncodeConverter.java:56)
    org.seasar.teeda.core.render.html.HtmlResponseStateManager.writeState(HtmlResponseStateManager.java:48)
    org.seasar.teeda.core.application.impl.TeedaStateManagerImpl.writeState(TeedaStateManagerImpl.java:85)
    org.seasar.teeda.core.taglib.core.ViewTag.doAfterBody(ViewTag.java:133)
    org.apache.jsp.converter.converter_jsp._jspx_meth_f_view_0(org.apache.jsp.converter.converter_jsp:118)
    org.apache.jsp.converter.converter_jsp._jspService(org.apache.jsp.converter.converter_jsp:78)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.seasar.teeda.core.util.ServletExternalContextUtil.dispatch(ServletExternalContextUtil.java:122)
    org.seasar.teeda.core.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:110)
    org.seasar.teeda.core.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:185)
    org.seasar.teeda.core.lifecycle.impl.RenderResponsePhase.executePhase(RenderResponsePhase.java:37)
    org.seasar.teeda.core.lifecycle.AbstractPhase.execute(AbstractPhase.java:55)
    org.seasar.teeda.core.lifecycle.LifecycleImpl.render(LifecycleImpl.java:134)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:80)
    org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:63)


 Comments   
Comment by manhole [ 2006-07-29 ]

UIOutput#restoreStateが次のようになっていたので、

public void restoreState(FacesContext context, Object state) {
    Object[] values = (Object[]) state;
    super.restoreState(context, values[0]);
    converter = (Converter) values[1]; // ココ
    value = values[2];
}

次のように修正しました。

public void restoreState(FacesContext context, Object state) {
    Object[] values = (Object[]) state;
    super.restoreState(context, values[0]);
    converter = (Converter) restoreAttachedState(context, values[1]); // ココ
    value = values[2];
}

(Revision 1481で修正済み)

Generated at Fri Apr 26 06:52:02 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.