java序列化相关问题 查询数据库的时候出现这个异常,我将查询到的结果封装到对象中。

org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [select * from gentie t where t.topic_id=?]; Invalid argument value: java.io.NotSerializableException; nested exception is java.sql.SQLException: Invalid argument value: java.io.NotSerializableException
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:107)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:796)
at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.queryForList(SimpleJdbcTemplate.java:235)
at com.bishe.servce.impl.TieZiImpl.getGenTie(TieZiImpl.java:101)
at com.bishe.control.TieZiAction.getTie(TieZiAction.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:174)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.bishe.control.SessionFilter.doFilter(SessionFilter.java:52)

第1个回答  推荐于2018-03-02
首先,解释系列化知识:
Java序列化(系列化)机制可以被写入一个字节流的一个实例对象的状态信息,因此它可以透过插座,或持久存储到数据库,或者文件系统,在需要时,根据在字节流中的信息来重构一个相同的对象。序列化机制在Java技术具有广泛的应用,EJB,RMI等作为依据。

实现类java.io.ObjectOutputStream中java.io.ObjectInputStream中的类的序列化机制。序列(序列化)对象,实例化一个ObjectOutputStream对象,然后调用writeObject()方法;反序列化(反序列化)时,ObjectInputStream的对象实例,然后调用readObject()方法。

高于你的错误在于一个或几个没有序列化的数据,导致没有办法创建一个输出流,导致发生java.io.NotSerializableException。

序列化的原因,我的猜测是,因为你的数据里面存在一个基于对象的数据,但对象不实现系列化。例如:如果你有一个地址字段,这个字段是一个类地址说明地址,这可能是全省的财产,城市,街道,等,或一些getter和setter方法,如果这个类没有实现系列化,通常这的问题。

毕竟,没有看到该程序,我猜,检查程序或进一步讨论的问题。本回答被网友采纳
第2个回答  2012-05-17
你传给sql拼接的参数是从一个对象里获得的,而这个参数类型是不可序列化的。造成出错
第3个回答  2012-05-16
抛的SQL异常,要看代码才知道
第4个回答  2012-05-16
sql 报的是无效的参数值,你看看参数是不是有问题,或者有没有值,类型什么的对不对追问

参数类型都和数据库是一致的,没问题

追答

你看看在传入sql中时,那个参数是否有值

追问

这个值确实是有的

追答

类型不对,你看你写的是OBject类型的

追问

不是类型不对哦 因为我有的表可以查询到结果,我都是这样的操作

追答

我才你的id应该是int类型的吧,我用int类型的数组试一下

追问

我用int 类型和string 类型都试过 我目前怀疑是spring 封装的JdbcTemplate查询mysql数据库时,queryForList 会出现这个异常

追答

呵呵, 好好看看代码吧。我感觉应该不会犯这种错误吧

追问

这个不是代码问题 是spring封装的方法queryForList不支持查询mysql数据库

追答

行,那好吧。你知道问题所在就行了

追问

因为我用queryForPage就没异常

本回答被提问者采纳
第5个回答  2012-05-16
抛的SQL异常,要看代码才知道追问

sql语句没问题 我直接用sql语句就可以查询到结果

追答

那你是不是程序执行后接口没有关呢,代码发来看看

追问

sql 语句String sql = "select * from gentie t where t.topic_id=?";
Object args = new Object[]{id};
jdbcTemplate.queryForList(sql, new GenTieRowMapper(), args)这里就是查询数据库,GenTieRowMapper 就是实现RowMapper接口将查询到的结果封装到对象中。

相似回答