我正在使用JSF1.2并试图使用<a4j:keepAlive beanName="reportController">,但是我一直在获取这个错误:
HTTP Status 500 原因: java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183 : java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData
我试图使用<a4j:keepAlive beanName="reportController">,因为当我搜索特定的报表,然后尝试对dataTable中的数据进行排序时,它似乎丢失了dataTable中的所有数据。
发布于 2016-02-03 07:38:21
原因: java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData
当您获得java.sql.Connection,甚至直接将DatabaseMetaData作为可序列化类的实例变量时,就会发生这种情况,如下所示。
public class ReportController implements Serializable {
private Connection connection; // BAD!!
private DatabaseMetaData metadata; // BAD!!
// ...
}您不应该声明和获取外部资源,如java.sql.Connection、Statement和ResultSet,也不应该将其属性作为类的实例变量。您应该尽快获取、使用和关闭它们,只需在方法本地范围内进行。从ReportController bean中删除这些实例变量,将它们移动到方法本地作用域,这个问题就会消失。只有DataSource (服务器管理的连接池)作为实例变量是可以的。
public class ReportController implements Serializable {
@Resource("jdbc/someDB")
private DataSource dataSource;
public void someMethod() {
try (Connection connection = dataSource.getConnection()) { // OK.
// ...
}
}
// ...
}<a4j:keepAlive>并不是造成这个问题的确切原因。它只是在HTTP会话中通过同一页面上的HTTP回发请求记住bean实例。HTTP会话属性本质上通常是序列化的。这种序列化只是触发并暴露了隐藏的设计问题。易失性一次性使用的资源,如数据库连接、语句、元数据、输入流、输出流等,绝对不应该是可序列化的,因此出现了此异常。
另请参阅:
https://stackoverflow.com/questions/35170752
复制相似问题