2011-08-01 11 views
21

私のDAOの実装では、Tomcat7を使ってサーバーを起動するときにシリアル化できない例外がスローされています。これを引き起こす原因は何ですか?私の他のDAOはこれをやっていません。ここでTomcat 7でNotSerializableExceptionの原因は何ですか?

クラスです:

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; 
    } 
} 

は、ここに私の設定です:

<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> 

は、ここに私のスタックです:それはシリアライズされる場合

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 
+0

このオブジェクトは、セッション内のどこか、またはセッションに格納されているオブジェクトの変数として設定していますか? –

+0

セッションに格納されるオブジェクト内の変数です。 – coder

+0

これを削除すると、このオブジェクトはHibernateセッションへのアクセス権を持っているため、決して自身をシリアル化できません。 –

答えて

21

UserDaoImplは(java.io.Serializableインタフェースを実装する必要がありますスタックトレースは、次のインスタンスを書き込もうとしていることを示します。オブジェクトストリームへのクラス)。

シリアル化されるインスタンスと、そのインスタンスのオブジェクトグラフ内のすべてのオブジェクトは、すべて直列化可能でなければなりません。シリアライズのJavadocから

は、クラスの

直列化は にjava.io.Serializableインタフェースを実装するクラスによって有効にされ...グラフをトラバースするとき、オブジェクト はないことに遭遇することができますSerializableインタフェースをサポートしていません。 この場合、NotSerializableExceptionがスローされ、 は非直列化可能オブジェクトのクラスを識別します。

これらのルールには例外があります。オブジェクトのシリアル化がいつ行われるのか、NotSerializableExceptionを回避するために必要なことを完全に理解するために、Java Object Serialization Specificationを読むことをお勧めします。

+9

これは特に有用な情報ではありません。 OPは起動時に*なぜ*これが起きているかを知る必要があります。 – skaffman

+1

これは根本原因ではなく、根本原因である可能性があります。 HibernateTemplateをシリアライズ可能にする方法を提案しますか? – pap

+1

春管理のBeanをシリアル化することはお勧めできません。 –

32

コード内のどこかに、UserDAOをセッションに格納している(またはUserDAOへの参照を持つオブジェクトを格納している)ために起こっています。 Tomcatは、すべてのアクティブなセッションの完全なオブジェクトグラフをシリアライズしようとします。そして、アクティブなセッションをシャットダウンすると、バックアップを開始するときにそれらを復元しようとします。これの要点は、TomcatはすべてのオブジェクトがSerializableであることを必要とする「通常の」Javaオブジェクトの直列化を使用することです。

  1. をユーザーセッション(一般的に良い練習)に非直列化可能オブジェクトを格納しないでください:改善する方法

  2. UserDAOをシリアライズ可能にします。おそらくSerializableインターフェイスを実装し、hibernateTemplateをtransientとマークするのはおそらくHibernateTemplateがそれ自体はシリアライザブルではないと思うからです。実際に動作させたい場合は、逆シリアル化でhibernateTemplateを再初期化するコードをいくつか追加する必要があります。
  3. セッションをシリアル化しないでください(<Manager pathname="" />を自分のアプリケーションまたはconf /ディレクトリのglobal tomcat context.xmlの<Context>要素内のcontext.xmlに追加してください)。あなたが本当にセッションを必要としない限り、あなたのためのアクションは、再起動しても持続する。
+1

私はこれを言う必要があります。あなたの答えは素晴らしいです。ありがとう、ありがとう。 – me1111

13

他の回答をここにも連載を説明する。これは、私は本当に私が問題を解決する助けた情報を追加したいグーグルの最初の結果があるので。

例外メッセージ自体は、この問題の原因となったクラスにどのフィールドを示すものではありません。シリアライズ可能なクラスを作成できず、Javaがフィールドをシリアル化しようとしないようにtransientキーワードを追加する必要がある場合、問題の原因となっているフィールドを特定するのは難しいことがあります。

は、Java/Tomcatにパラメータ-Dsun.io.serialization.extendedDebugInfo=trueを追加した場合、それを開始するときに例外がはるかに有用であろう。ここでは、例外メッセージがどのように見えるかの例です:

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", [email protected]) 
- 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", [email protected]) 
- 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}) 

あなたはおそらくクラスが読み込まれたときにそれらのフィールドを設定する必要がシリアライズされていないフィールドを作るために、過渡キーワードを使用しない場合。これを行うには、readObject()メソッドを実装する必要があります。ここに例があります:

+4

'-Dsun.io.serialization.extendedDebugInfo = true'の+1は、スタンドアロンのJavaアプリケーションでも非常に役に立ちます。 – javashlook

関連する問題