【问题标题】:Session replication with Spring cause NotSerializableException使用 Spring 进行会话复制导致 NotSerializableException
【发布时间】:2014-02-22 16:14:58
【问题描述】:

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

我使用了this tutorial,并且在位于 tomcat 示例中的测试 servlet 上一切正常。 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 中添加了 我试过使 EntityManager 字段瞬态,但它没有帮助。我认为可能是spring试图将一些bean保存到会话中,但我已经搜索了项目并没有找到任何会话范围的bean。

有人知道如何处理这个问题吗?

更新:

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>

【问题讨论】:

    标签: java spring session tomcat7


    【解决方案1】:

    您的数据源不是可序列化的

    将您的类字段设为org.apache.commons.dbcp.BasicDataSourcetransient 的实例,并确保它是由 Spring 注入的,然后您就完成了。

    编辑:刚才我看到您将 EntityManager 设置为瞬态,因此我必须要求您尽可能提供相关代码。

    【讨论】:

    • 当然,我已经编辑了我的帖子。抱歉,由于公司政策,我无法共享所有代码。如果还不够,请告诉我,我会提供额外的代码。
    • 谢谢!好吧,既然显而易见的原因已经解决了,...也许您以某种方式将 entityManager 保存在代码中的其他位置(例如,您创建第二个对象并在其构造函数中传递并保存 entityManager),或者您以其他方式保留对特定entityManager 实例的引用?
    • 谢谢,我发现 EntityManager 不是瞬态的几个地方,我把它变成了瞬态的。问题仍然出现。我会尝试找到没有实现 Serializable 的 DAO。
    猜你喜欢
    • 1970-01-01
    • 2011-04-20
    • 2011-10-17
    • 1970-01-01
    • 2023-03-04
    • 2016-04-26
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多