使用EhCache将对象put进缓存后,get出来为null的问题
问题
以前使用EhCache缓存数据的时候,保存的value都是基于Java的基础类型数据,最近发现保存自定义类型的对象时,get()出来的Element要么为null,要么当用Element的getValue()时抛出net.sf.ehcache.CacheException: Value xxx is not Serializable
异常。
解决方案
- EhCache在put对象时,该对象必须是可序列化(Serializable)的类型,也就是说要实现
java.io.Serializable
。因为EhCache在put对象时,是序列化保存的。
官方文档对EhCache put方法的说明:put
void put(Element element)throws IllegalArgumentException,IllegalStateException,CacheException
Put an element in the cache.
Resets the access statistics on the element, which would be the case if it has previously been gotten from a cache, and is now being put back.Also notifies the CacheEventListener that:
the element was put, but only if the Element was actually put.
if the element exists in the cache, that an update has occurred, even if the element would be expired if it was requested
Parameters:
element - An object. If Serializable it can fully participate in replication and the DiskStore.Throws:
IllegalStateException - if the cache is not Status.STATUS_ALIVE
IllegalArgumentException - if the element is null
CacheException
另外:EhCache的flush()方法是将缓存序列化到文件中, 缓存配置diskPersistent=“true"时有用。如果put没有序列化的对象后再flush(),从Cache中get()将得到null(不支持序列化对象,没法持久化到文件中)。如果put后没有flush(),则可以get()到缓存的Element,但是当调用Element的getValue()取缓存对象时,会报net.sf.ehcache.CacheException: Value xxx is not Serializable
异常。