jfinal在使用ehcache时 报错 com.jfinal.plugin.activerecord.DaoContainerFactory$DaoMap

[ERROR]-[Thread: JFinal-Scanner]-[net.sf.ehcache.store.disk.DiskStorageFactory$DiskWriteTask.call()]: Disk Write of findFloors failed: 
java.io.NotSerializableException: com.jfinal.plugin.activerecord.DaoContainerFactory$DaoMap
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
	at java.util.ArrayList.writeObject(ArrayList.java:742)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:440)
	at net.sf.ehcache.Element.writeObject(Element.java:875)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
	at net.sf.ehcache.util.MemoryEfficientByteArrayOutputStream.serialize(MemoryEfficientByteArrayOutputStream.java:97)
	at net.sf.ehcache.store.disk.DiskStorageFactory.serializeElement(DiskStorageFactory.java:403)
	at net.sf.ehcache.store.disk.DiskStorageFactory.write(DiskStorageFactory.java:385)
	at net.sf.ehcache.store.disk.DiskStorageFactory$DiskWriteTask.call(DiskStorageFactory.java:477)
	at net.sf.ehcache.store.disk.DiskStorageFactory$PersistentDiskWriteTask.call(DiskStorageFactory.java:1071)
	at net.sf.ehcache.store.disk.DiskStorageFactory$IndexWriteTask.call(DiskStorageFactory.java:1108)
	at net.sf.ehcache.store.disk.DiskStorageFactory.unbind(DiskStorageFactory.java:921)
	at net.sf.ehcache.store.disk.DiskStore.dispose(DiskStore.java:664)
	at net.sf.ehcache.store.CacheStore.dispose(CacheStore.java:342)
	at net.sf.ehcache.Cache.dispose(Cache.java:2588)
	at net.sf.ehcache.CacheManager.shutdown(CacheManager.java:1548)
	at com.jfinal.plugin.ehcache.EhCachePlugin.stop(EhCachePlugin.java:95)
	at com.jfinal.core.JFinal.stopPlugins(JFinal.java:115)
	at com.jfinal.core.JFinalFilter.destroy(JFinalFilter.java:91)
	at org.eclipse.jetty.servlet.FilterHolder.destroyInstance(FilterHolder.java:153)
	at org.eclipse.jetty.servlet.FilterHolder.doStop(FilterHolder.java:131)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.stop(AbstractLifeCycle.java:89)
	at org.eclipse.jetty.servlet.ServletHandler.doStop(ServletHandler.java:204)
	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.security.SecurityHandler.doStop(SecurityHandler.java:395)
	at org.eclipse.jetty.security.ConstraintSecurityHandler.doStop(ConstraintSecurityHandler.java:463)
	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.session.SessionHandler.doStop(SessionHandler.java:136)
	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:116)
	at com.jfinal.server.Scanner.compare(Scanner.java:94)
	at com.jfinal.server.Scanner.working(Scanner.java:57)
	at com.jfinal.server.Scanner.access$000(Scanner.java:31)
	at com.jfinal.server.Scanner$1.run(Scanner.java:101)
	at java.util.TimerThread.mainLoop(Timer.java:555)
	at java.util.TimerThread.run(Timer.java:505)

翻了下源码,确实是没有实现Serializable接口

image.png不过并没有影响项目运行,@JFinal 大佬,这个需要处理吗,求解释?

评论区

JFinal

2018-09-04 15:41

DaoContainerFactory 这个应该是处于 Config.java 中的一个属性,为啥要将这个字段 write 到缓存中去?

对于 Config 来说,缓存一个 String 足够了,通过 string 得到 Config 的代码:
Config config = Db.use(string);

錢勢惘導

2018-09-04 15:49

@JFinal 我并没有缓存这个字段,只是使用了dao.findByCache()

錢勢惘導

2018-09-04 16:33

@JFinal 您好,我知道是什么原因了,之前项目没有引入slf4j-api和slf4j-log4j12的依赖,没有报错,在我引入了这两个依赖后,就会报这个错误,但是我觉得他们之间好像并没有什么联系,我也不会了... 脑阔疼...........

JFinal

2018-09-04 21:02

@錢勢惘導 异常表明你的代码是往 ehcache 中存入 DaoContainerFactory 这个对象了,而这个对象一般是在 Config 对象中,也就是说你很可能是向 ehcache 中存放 Config 对象了

至于怎么存的,很可能是间接存放,举个例了,假定你有一个类叫 Aaa,然后这个 Aaa 声明了一个属性 private Config config,这样在向 ehcache 中存放 Aaa 时就会间接存放 Confing , 从存间接存放 DaoContainerFactory

还有一个要注意的地方,看看你有没有向 session 中存放 Config 对象,由于 jfinal 支持 session 持久化到 ehcache ,所以存放在 session 中的数据也会间接被存放到 ehcache 中,当然,这种情况只是在重启的时候存取一下,不影响总体

錢勢惘導

2018-09-05 16:06

@JFinal 您好,现在这个问题已经解决了。
问题大概是这样:我有两张表,表与表之间是一对多的关系,我在一方的dao中引入了多方的service,而一方在缓存时会缓存多方的service,而多方的service有没有实现Serializable接口,所以会报类似于这样的错误!
现在还有个问题向您咨询,就是一对多时,我之前想的是把多方的service直接引入,CRUD,缓存,清楚缓存等操作都在service层实现,但是这样的话,一的一方就不能缓存了,如果缓存就会报没有实现Serializable接口的异常;
我现在把他们分开写了,先查询一方的集合,然后遍历,在通过一方的唯一标识查询多方的集合,然后在put到一方里面,请问我的解决方式可以吗?还有没有比这个更好的办法?
麻烦您有时间回答一下,谢谢您了!

JFinal

2018-09-05 16:56

@錢勢惘導 service 本身不要缓存起来,缓存都是针对数据的,例如缓存 model 或者 List models

热门反馈

扫码入社