使用Spring进行会话复制会导致NotSerializableException

时间:2014-01-30 11:26:24

标签: java spring session tomcat7

我正在尝试使用会话复制配置tomcat 7群集。

我使用this tutorial,一切都可以在测试servlet上运行,这些servlet位于tomcat示例中。  http://localhost/examples/servlets/servlet/SessionExample

所以我添加了一些属性,然后停止了其中一个节点,并且会话已成功复制。

但是当我使用hibernate + spring mvc + spring security将此配置移动到我的应用程序时,当我尝试登录时,我总是得到异常

SEVERE: Unable to serialize delta request for sessionid [69845CF0E87B3F0F64FB605FAC1D4987.node1]
java.io.NotSerializableException: org.apache.commons.dbcp.BasicDataSource

我的所有会话对象都实现了 Serializable 接口,在web.xml中我添加了 我试过make EntityManager 字段瞬态,但它没有帮助。我认为可能是春天试图将一些bean保存到会话中,但我搜索了项目并没有找到任何会话范围的bean。

有人有想法如何处理这个问题吗?

UPD:

public abstract class AbstractDAOImpl<E, I> implements AbstractDAO<E, I> {

    private static final long serialVersionUID = 7372882616977337461L;

    @PersistenceContext
    protected transient EntityManager entityManager;

的applicationContext.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    p:driverClassName="${jdbc-driver}" p:url="${jdbc-db-url}" p:username="${jdbc-db-username}"
    p:password="${jdbc-db-passwd}" p:testWhileIdle="true"
    p:timeBetweenEvictionRunsMillis="7200000" p:validationQuery="select 1;"
    destroy-method="close" />


    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="MIQlocal" />
        <property name="dataSource" ref="dataSource" />
        <property name="jpaDialect" ref="jpaDialect" />
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </property>
    </bean>

    <bean id="transactionManager" name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <property name="dataSource" ref="dataSource" />
    </bean>

1 个答案:

答案 0 :(得分:0)

您的数据源不是 Serializable

将您的类字段设为org.apache.commons.dbcp.BasicDataSource transient的实例,并确保它由Spring注入,您已完成。

编辑:刚才我看到你已经使EntityManager成为瞬态,所以我必须要求你尽可能提供相关的代码。