Uploaded image for project: 'Teeda'
  1. Teeda
  2. TEEDA-25

STATE_SAVING_METHODがclientの場合にNotSerializableExceptionが発生する

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.0-beta-5
    • Fix Version/s: 1.0-beta-6
    • Component/s: Teeda Core
    • 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)
      

        Activity

        Hide
        manhole manhole added a comment -

        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で修正済み)

        Show
        manhole manhole added a comment - 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で修正済み)

          People

          • Assignee:
            manhole manhole
            Reporter:
            manhole manhole
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development