【问题标题】:java.io.NotSerializableException is thrown while restarting Vaadin application重新启动 Vaadin 应用程序时抛出 java.io.NotSerializableException
【发布时间】:2014-10-02 21:28:15
【问题描述】:

当我重新启动我的 Tomcat 时,我收到以下错误:

2014;10;01; 15;49;47;055; WARN; com.vaadin.event.ListenerMethod;[localhost-startStop-2]; Error in serialization of the application: Class com.aaa.bbb.MyServlet$1 must implement serialization.
2014;10;01; 15;49;47;055; WARN; org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/my-vaadin];[localhost-startStop-2]; Cannot serialize session attribute com.vaadin.server.VaadinSession.MyServlet for session ...
java.io.NotSerializableException: org.apache.catalina.loader.WebappClassLoader
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) ~[na:1.6.0_31]
    at java.io.ObjectOutputStream.defaultWriteObject(Unknown Source) ~[na:1.6.0_31]
    at com.vaadin.event.ListenerMethod.writeObject(ListenerMethod.java:88) ~[vaadin-server-7.2.7.jar:7.2.7]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_31]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.6.0_31]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.6.0_31]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.6.0_31]
    ...

【问题讨论】:

    标签: java serialization vaadin vaadin7


    【解决方案1】:

    警告说匿名内部类(在MyServlet 类中)必须实现序列化。我的 servlet 类只包含一个匿名内部类,它实现了Serializable 并有一个serialVersionUID

    public class MyServlet extends VaadinServlet implements SessionInitListener {
        //...
    
        @Override
        public void sessionInit(SessionInitEvent event) throws ServiceException {
            event.getSession().addBootstrapListener(new BootstrapListener() {
                private static final long serialVersionUID = 1L;
    
                @Override
                public void modifyBootstrapPage(BootstrapPageResponse response) {
                    //...
                }
    
                @Override
                public void modifyBootstrapFragment(BootstrapFragmentResponse response) {
                    //...
                }
            });
        }
    }
    

    经过一番研究,我找到了解决方案:NotSerializableException on anonymous class
    所以我们要把匿名内部类改成静态嵌套类:

    public class MyServlet extends VaadinServlet implements SessionInitListener {
        //...
    
        @Override
        public void sessionInit(SessionInitEvent event) throws ServiceException {
            event.getSession().addBootstrapListener(new MyBootstrapListener());
        }
    
        private static class MyBootstrapListener implements BootstrapListener {
            private static final long serialVersionUID = 1L;
    
            @Override
            public void modifyBootstrapPage(BootstrapPageResponse response) {
                //...
            }
    
            @Override
            public void modifyBootstrapFragment(BootstrapFragmentResponse response) {
                //...
            }
        });
    }
    

    或者如果我们在反序列化后不想要多个对象:

    public class MyServlet extends VaadinServlet implements SessionInitListener {
        //...
    
        @Override
        public void sessionInit(SessionInitEvent event) throws ServiceException {
            event.getSession().addBootstrapListener(MyBootstrapListener.INSTANCE);
        }
    
        private static class MyBootstrapListener implements BootstrapListener {
            private static final long serialVersionUID = 1L;
            private static final MyBootstrapListener INSTANCE = new MyBootstrapListener();
    
            @Override
            public void modifyBootstrapPage(BootstrapPageResponse response) {
                //...
            }
    
            @Override
            public void modifyBootstrapFragment(BootstrapFragmentResponse response) {
                //...
            }
    
            private Object readResolve() {
                return INSTANCE;
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 2013-01-30
      • 2018-01-15
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多