2012-07-01 23 views
4

重新啓動tomcat服務器後,我得到InvalidObjectException: Could not find a SessionFactory named: nullTomcat/Eclipse:在上下文重新加載期間禁用HttpSession序列化

,我發現了一些可能的解決方案:

如果您嘗試序列化斷開Hibernate的Session,並在不同的虛擬機反序列化,就會出現此異常,或者,如果 類加載器重新啓動後,例如,在您的應用程序服務器或Web容器熱重新部署 期間。這在Tomcat中是特別可見的 。在應用程序服務器中,如記錄所示,始終使用JNDI來存儲SessionFactory。在Tomcat或其他Web容器中, 在上下文重新加載期間禁用HttpSession序列化。這有副作用,在Web容器的文檔中有解釋。

我該怎麼辦?在上下文重新加載期間禁用HttpSession序列化?

注意:我在Eclipse中使用Tomcat7。

UPDATE:

我試着啓用context.xml本文標籤:

<Manager pathname="" />

,是的,異常消失,但我失去了持續會話,所以我必須要重新登錄tomcat服務器重啓後。

如果我相信會話持久性能夠很好地理解,那麼在Tomcat重新啓動之後,應該保留該會話(並且我不能通過登錄創建新的會話)。 JSF應用程序?

UPDATE2(會話管理器):

​​

而且我hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
<session-factory> 
    <property name="connection.url">jdbc:sqlserver://localhost;databaseName=RXP</property> 
    <property name="connection.username">user</property> 
    <property name="connection.password">password</property> 
    <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
    <property name="dialect">org.hibernate.dialect.SQLServer2008Dialect</property> 
    <property name="current_session_context_class">thread</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 

    <mapping class="tables.User"/> 

</session-factory> 
</hibernate-configuration> 

而且我會話工廠

public final class DaoSF implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private static SessionFactory sessionFactory; 
    private static ServiceRegistry serviceRegistry; 

    public static SessionFactory getSessionFactory() { 
    try { 
     Configuration configuration = new Configuration(); 
     configuration.configure("hibernate.cfg.xml"); 
     serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();   
     sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
     return sessionFactory; 
    } 
    catch (HibernateException he) { 
     ... 
    } 
    } 
} 

回答

7

你應該能夠TU通過在Tomcat配置文件的上下文區域內放置:

<Manager pathname="" /> 

請參閱Tomcat文檔:
配置參考>管理器組件>禁用會話持久性

+0

是的,我已經嘗試過了一個和異常自敗。但會議沒有現在存儲,我必須每次都重新登錄,我重新啓動Tomcat服務器...... – gaffcz

+0

(我更新的問題,請大家看看),如果你不希望關閉會話持久性,那麼你必須修復會話中的對象,也就是說你必須讓它們可序列化(實現java.io.Serializable)(參見[documentation](http://tomcat.apache.org/tomcat-7.0-doc/config/) 。manager.html#Persistence_Across_Restarts)) – Codo

+0

我所有的豆類serializabled :(('實現Serializable ...私有靜態最後的serialVersionUID長= 1升;?') – gaffcz

0

answer by Codo是正確的。

這裏是一個實現上述標籤的例子。

在你的web應用程序的META-INF文件夾,在文件context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Context path=""> 
    <Manager pathname=""/> 
</Context> 
相關問題