使用EhCache将对象put进缓存后,get出来为null的问题

使用EhCache将对象put进缓存后,get出来为null的问题

问题

以前使用EhCache缓存数据的时候,保存的value都是基于Java的基础类型数据,最近发现保存自定义类型的对象时,get()出来的Element要么为null,要么当用Element的getValue()时抛出net.sf.ehcache.CacheException: Value xxx is not Serializable异常。

解决方案

  1. 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异常。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。