Model序列化的问题

用户登录后,将用户信息存入session就反复报错,百度查了半天,说是序列化的问题,但是我看我的modal已经添加了序列表的标识了呀~~


报错信息如下:

2016-11-27 18:22:33.945:WARN:oejss.HashedSession:Problem saving session 1eq1o3er9i7bxf19c6csh6lu0
java.io.NotSerializableException: com.jfinal.log.Log4jLog
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
	at org.eclipse.jetty.server.session.HashedSession.save(HashedSession.java:170)
	at org.eclipse.jetty.server.session.HashedSession.save(HashedSession.java:122)
	at org.eclipse.jetty.server.session.HashSessionManager.invalidateSessions(HashSessionManager.java:388)
	at org.eclipse.jetty.server.session.AbstractSessionManager.doStop(AbstractSessionManager.java:293)
	at org.eclipse.jetty.server.session.HashSessionManager.doStop(HashSessionManager.java:135)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
	at org.eclipse.jetty.server.session.SessionHandler.doStop(SessionHandler.java:135)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
	at org.eclipse.jetty.server.handler.HandlerWrapper.doStop(HandlerWrapper.java:107)
	at org.eclipse.jetty.server.handler.ContextHandler.doStop(ContextHandler.java:805)
	at org.eclipse.jetty.servlet.ServletContextHandler.doStop(ServletContextHandler.java:160)
	at org.eclipse.jetty.webapp.WebAppContext.doStop(WebAppContext.java:516)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
	at com.jfinal.server.JettyServer$1.onChange(JettyServer.java:105)
	at com.jfinal.server.Scanner.compare(Scanner.java:88)
	at com.jfinal.server.Scanner.working(Scanner.java:57)
	at com.jfinal.server.Scanner.access$0(Scanner.java:55)
	at com.jfinal.server.Scanner$1.run(Scanner.java:94)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)
	
	
Generater生成的modal:

/**
 * Generated by JFinal.
 */
@SuppressWarnings("serial")
public class Admin extends BaseAdmin<Admin> {
	public static final Admin dao = new Admin();
	public static final String SESSSION_USER = "user" ;
}


评论区

JFinal

2016-11-27 19:53

异常提示是 com.jfinal.log.Log4jLog 这个类没有做序列化,在你 Model 的某个地方,或者 model 中放入了 Log4jLog 这个对象引发的,删之

JFinal

2016-11-27 19:55

后来看了一下,应该与 Model 无关,是你在往 session 中放入的某个对象,这个对象中有 com.jfinal.log.Log4jLog 这个属性而已,用开发工具搜索一下 Log就能找到

nbjgl

2016-11-30 20:50

@JFinal 非常感谢~~ 确实是这个问题,在自定义的_baseModel中有一个log对象,Generator生成Model都继承自这个_baseModel

nbjgl

2016-11-30 20:58

只是不明白这其中的原理~~我把Admin这个对象放session 怎么还会跟父级的log扯上关系~ @Jfinal

JFinal

2016-11-30 21:43

@nbjgl jfinal 为了让开发环境中的 jetty 使用体验更好,会让开发者在重启项目以后仍然可以保持住 session,就是以避免在开发类似于后台管理类项目时频繁去输入用户名和密码去登录,所以将 jetty 设置成为了重启前持久化 session 到硬盘

而这个 jetty 对session 中的数据持久化时,要求被持久化的对象是可以被序列化的,而这个 Log4jLog 对象无法被序列化,所以报这个异常

在生产模式下根本不会存在这个问题

JFinal

2016-11-30 21:45

@nbjgl 还有一个简单的办法是,在这些不需要被持久化的属性定义之上使用 transient 关键字

热门反馈

扫码入社