【发布时间】:2019-05-05 02:06:25
【问题描述】:
Spring-Boot 中的 Primefaces/Joinfaces JSF 应用程序。
应用程序在独立运行时运行良好,但我最近开始通过 Spring-Session 实现会话复制。当会话被持久化到会话存储时,我得到一个不可序列化的异常。
引起:java.io.NotSerializableException: com.company.application.service.dao.security.RoleBasedSecurityDao$$EnhancerBySpringCGLIB$$9de506c
查看该错误消息,似乎序列化异常不是针对类本身,而是针对类所拥有的东西。它上面唯一的东西就是 JDBCTemplate。
@Repository
public class RoleBasedSecurityDao {
private final static Logger log = LoggerFactory.getLogger(RoleBasedSecurityDao.class);
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
@Qualifier("dataSource")
public void setDataSource(DataSource dataSource) {
jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}
[...]
}
如果我在类定义中添加“implements Serializable”,错误会发生变化:
引起:java.io.NotSerializableException: org.springframework.dao.support.PersistenceExceptionTranslationInterceptor
我不熟悉 JSF,但根据我的阅读,期望您的所有 JSF 类都是可序列化的。当需要 JdbcTemplate 实例时,如何使 DAO 可序列化?
【问题讨论】:
-
您在 jsf 托管会话或查看作用域 bean 中有(非瞬态)对 spring bean 的引用?不要那样做。并且不要尝试序列化 spring 管理的单例 bean。他们应该只做业务逻辑和存储配置参数。它们不代表在集群中的实例之间共享所需的用户会话范围的应用程序数据。
-
实际上,您的问题中没有任何与 jsf 相关的内容......
-
@Selaron 如何在反序列化后在托管 bean 上重构这些临时 bean?
-
似乎有多种非常不同的方法。例如,找到了这个stackoverflow.com/questions/3851561/… 和这个stackoverflow.com/questions/3180963/…。如果您在那里找到了一个好的答案,请随时对其进行投票并在您的答案中引用它,描述您的方法并标记您的问题已回答。
标签: spring-boot jsf spring-session joinfaces