Java 数据库中持久化后反序列化的对象不能强制转换为源类:ClassCastException:TestDomain不能强制转换为TestDomain
在春季课程中,我面临以下问题: 我试着搜索,发现在获得testDomainObj之后,它是Object类的实例。所以,很明显,反序列化对象会丢失其元信息 我对JdbcOperationsSessionRepository进行了如下配置: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
@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类时,这有帮助吗?