java tomcat7 notserializableexception

java - ¿Qué causa una excepción NotSerializableException en Tomcat 7?



tomcat7 (3)

Esta pregunta ya tiene una respuesta aquí:

Mi implementación de DAO está generando una excepción no serializable en el inicio del servidor con Tomcat7. ¿Alguna idea de qué causa esto? Ninguno de mis otros DAO está haciendo esto.

Aquí está la clase:

package com.project.dao; import java.util.List; import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.HibernateTemplate; import com.project.model.User; public class UserDAOImpl implements UserDAO { private HibernateTemplate hibernateTemplate; public void setSessionFactory(SessionFactory sessionFactory) { this.hibernateTemplate = new HibernateTemplate(sessionFactory); } @Override public void saveUser(User user) { hibernateTemplate.saveOrUpdate(user); } @Override @SuppressWarnings("unchecked") public List<User> listUser() { return hibernateTemplate.find("from User"); } @Override @SuppressWarnings("unchecked") public User getUserByID(long userID) { List<User> users= hibernateTemplate.find("from User where id = ''" + userID + "''"); return users.size() > 0 ? users.get(0) : null; } }

Aquí está mi configuración:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <bean id="myDataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost/context</value> </property> <property name="username"> <value>someUser</value> </property> <property name="password"> <value>somePassword</value> </property> <!-- Disable the second-level cache --> <!-- Echo all executed SQL to stdout --> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="myDataSource" /> <property name="annotatedClasses"> <list> <value>com.project.model.User</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="myUserDAO" class="com.project.dao.UserDAOImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean> </beans>

Aquí está mi pila:

SEVERE: IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.news.dao.UserDAOImpl java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.project.dao.UserDAOImpl at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1600) at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1073) at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:284) at org.apache.catalina.session.StandardManager.load(StandardManager.java:204) at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:470) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5241) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.startup.Catalina.start(Catalina.java:620) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431) Caused by: java.io.NotSerializableException: com.project.dao.UserDAOImpl at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) at org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1676) at org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:1090) at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:411) at org.apache.catalina.session.StandardManager.unload(StandardManager.java:353) at org.apache.catalina.session.StandardManager.stopInternal(StandardManager.java:497) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.StandardContext$4.run(StandardContext.java:5464) at java.lang.Thread.run(Thread.java:662) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5481) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1072) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1072) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.StandardService.stopInternal(StandardService.java:502) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.StandardServer.stopInternal(StandardServer.java:748) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.startup.Catalina.stop(Catalina.java:693) at org.apache.catalina.startup.Catalina.start(Catalina.java:654) ... 6 more Jul 31, 2011 9:27:21 PM org.apache.catalina.session.StandardManager startInternal SEVERE: Exception loading sessions from persistent storage java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.project.dao.UserDAOImpl at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1600) at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1073) at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:284) at org.apache.catalina.session.StandardManager.load(StandardManager.java:204) at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:470) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5241) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.startup.Catalina.start(Catalina.java:620) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431) Caused by: java.io.NotSerializableException: com.project.dao.UserDAOImpl at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) at org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1676) at org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:1090) at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:411) at org.apache.catalina.session.StandardManager.unload(StandardManager.java:353) at org.apache.catalina.session.StandardManager.stopInternal(StandardManager.java:497) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.StandardContext$4.run(StandardContext.java:5464) at java.lang.Thread.run(Thread.java:662) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5481) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1072) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1072) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.StandardService.stopInternal(StandardService.java:502) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.core.StandardServer.stopInternal(StandardServer.java:748) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) at org.apache.catalina.startup.Catalina.stop(Catalina.java:693) at org.apache.catalina.startup.Catalina.start(Catalina.java:654) ... 6 more


Está sucediendo porque en algún lugar de su código, está almacenando un UserDAO en la sesión (o está almacenando un objeto que tiene una referencia a un UserDAO). Tomcat intenta serializar el gráfico de objetos completo de todas las sesiones activas cuando lo cierra, y luego intenta restaurarlas cuando lo inicia de nuevo. El punto crucial de esto es que Tomcat utiliza la serialización de objetos Java "normal", lo que requiere que todos los objetos sean Serializable .

Cómo remediar:

  1. No almacene objetos no serializables en la sesión del usuario (generalmente es una buena práctica).
  2. Haga que su UserDAO sea serializable. Probablemente implique implementar la interfaz Serializable y marcar su plantilla de hibernación como transient ya que no creo que la HibernateTemplate sea, en sí misma, serializable. Es posible que tenga que agregar algún código que reinicialice la plantilla de hibernate en la deserialización si realmente desea que funcione.
  3. No tenga sesiones de serialización de Tomcat (agregue <Manager pathname="" /> al context.xml, ya sea en su propia aplicación o en el tomcat global context.xml en el directorio conf /, dentro del elemento <Context> . Esto puede ser el mejor curso de acción para usted, a menos que realmente necesite que las sesiones se prolonguen durante los reinicios.

Las otras respuestas aquí explican bien la serialización. Como este es el primer resultado en Google, quería agregar información que realmente me ayudó a resolver el problema.

El mensaje de excepción en sí no indica qué campo en qué clase causó este problema. Si no puede hacer que una clase se pueda serializar y necesita agregar la palabra clave transitoria para que Java no intente serializar un campo, puede ser difícil determinar qué campo está causando el problema.

Si agrega el parámetro -Dsun.io.serialization.extendedDebugInfo=true a Java / Tomcat al iniciarlo, la excepción será mucho más útil. Aquí hay un ejemplo de cómo se verá el mensaje de excepción:

java.io.NotSerializableException: za.co.abc.presentation.control.Three - field (class "za.co.abc.presentation.control.Two", name: "three", type: "class za.co.abc.presentation.control.Three") - object (class "za.co.abc.presentation.control.Two", za.co.abc.presentation.control.Two@fbbb20) - field (class "za.co.abc.presentation.control.One", name: "two", type: "class za.co.abc.presentation.control.Two") - object (class "za.co.abc.presentation.control.One", za.co.abc.presentation.control.One@17ee6c9) - field (class "za.co.abc.presentation.control.Trail", name: "one", type: "class za.co.abc.presentation.control.One") - root object (class "za.co.abc.presentation.control.Trail", {/click-tests/home.htm=home})

Si utiliza la palabra clave transitoria para hacer que los campos no se serialicen, probablemente tenga que configurar esos campos cuando se lea la clase. Tienes que implementar el método readObject () para hacer eso. Aquí hay un ejemplo:

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { // magically read all non-transient fields from input stream and populate their values in.defaultReadObject(); someTransientField = new NotSerializableClass(); }


UserDaoImpl debe implementar la interfaz java.io.Serializable si se va a serializar (su seguimiento de pila indica que se ha intentado escribir una instancia de la clase en una secuencia de objetos).

La instancia que se va a serializar, junto con todos los objetos en el gráfico de objetos de esa instancia, debe ser serializable.

De los javadocs para serializable,

La serialización de una clase está habilitada por la clase que implementa la interfaz java.io.Serializable ... Al atravesar un gráfico, se puede encontrar un objeto que no es compatible con la interfaz Serializable. En este caso, se lanzará la NotSerializableException e identificará la clase del objeto no serializable.

Tenga en cuenta que hay excepciones a estas reglas. Le recomiendo que lea la Especificación de serialización de objetos de Java para comprender por completo cuándo se realiza la serialización de objetos y qué se necesita para evitar una excepción NotSerializableException.