Java 数据库中持久化后反序列化的对象不能强制转换为源类:ClassCastException:TestDomain不能强制转换为TestDomain

Java 数据库中持久化后反序列化的对象不能强制转换为源类:ClassCastException:TestDomain不能强制转换为TestDomain,java,spring,spring-session,Java,Spring,Spring Session,在春季课程中,我面临以下问题: 我试着搜索,发现在获得testDomainObj之后,它是Object类的实例。所以,很明显,反序列化对象会丢失其元信息 我对JdbcOperationsSessionRepository进行了如下配置: @Configuration public class AppConfig { @Bean SessionRepository sessionFactoryBean(JdbcTemplate jdbcTemplate, PlatformTrans

在春季课程中,我面临以下问题:

我试着搜索,发现在获得testDomainObj之后,它是Object类的实例。所以,很明显,反序列化对象会丢失其元信息

我对JdbcOperationsSessionRepository进行了如下配置:

@Configuration
public class AppConfig {
    @Bean
    SessionRepository sessionFactoryBean(JdbcTemplate jdbcTemplate, PlatformTransactionManager transactionManager) {
        return new JdbcOperationsSessionRepository(jdbcTemplate, transactionManager);
    }
}
@Bean
SessionRepository sessionFactoryBean(JdbcTemplate jdbcTemplate, PlatformTransactionManager transactionManager) {
    JdbcOperationsSessionRepository sessionRepository = new JdbcOperationsSessionRepository(jdbcTemplate, transactionManager);
    GenericConversionService conversionService = new GenericConversionService();
    conversionService.addConverter(Object.class, byte[].class,
            new SerializingConverter());
    conversionService.addConverter(byte[].class, Object.class,
            new DeserializingConverter(Thread.currentThread().getContextClassLoader()));
    sessionRepository.setConversionService(conversionService);
    return sessionRepository;
}
并在application.properties中激活它:

执行sessionRepository.savesession后,testDomain对象保存在数据库中的最后一件事


如何理解和处理这个问题?

好吧,我回答我的问题。在我的例子中,我应该为反序列化程序指定ClassLoader,如下所示:

@Configuration
public class AppConfig {
    @Bean
    SessionRepository sessionFactoryBean(JdbcTemplate jdbcTemplate, PlatformTransactionManager transactionManager) {
        return new JdbcOperationsSessionRepository(jdbcTemplate, transactionManager);
    }
}
@Bean
SessionRepository sessionFactoryBean(JdbcTemplate jdbcTemplate, PlatformTransactionManager transactionManager) {
    JdbcOperationsSessionRepository sessionRepository = new JdbcOperationsSessionRepository(jdbcTemplate, transactionManager);
    GenericConversionService conversionService = new GenericConversionService();
    conversionService.addConverter(Object.class, byte[].class,
            new SerializingConverter());
    conversionService.addConverter(byte[].class, Object.class,
            new DeserializingConverter(Thread.currentThread().getContextClassLoader()));
    sessionRepository.setConversionService(conversionService);
    return sessionRepository;
}

您遇到这个问题是因为您手动注册JdbcOperationsSessionRepository bean,而不是重用Spring会话JDBC配置工具,即@EnableJdbcHttpSession。看


Spring Boot为Spring会话提供了自动配置支持,因此您甚至不需要使用@EnableJdbcHttpSession,从而使这变得更加容易。只需将spring.session.store type=jdbc添加到配置属性中,就可以为您解决所有问题

不会TestDomain testDomain1=session1.getAttributesession1.getId;工作?首先我尝试了这个,但我得到了ClassCastException,比如当我将对象testDomain1强制转换到上面的TestDomain类时,这有帮助吗?