仅当对象可序列化时才对其进行缓存

时间:2018-12-07 06:54:43

标签: java spring caching memcached simple-spring-memcached

我通过在具有以下声明的方法上使用@Cacheable批注来启用缓存:

@Cacheable(value = "myCache", key = "#t+ '_' + #key", condition = "#key != null")
public <T> T get(String t, VendorProperty<T> key, T defaultValue) {
    return get(t, key).orElse(default_value);
}

但是,如果尝试缓存的对象不可序列化(例如:NotSerializableException),则会抛出DateTimeFormatter

我想知道是否只有在对象可序列化时才可以缓存对象,以免发生此异常。

我正在使用memcache使用simple-spring-memcache库来缓存对象。

PS:我无法实现Serializable接口,因为DateTimeFormatter是预定义的类。

2 个答案:

答案 0 :(得分:2)

您可以指定条件:

 condition = "#key != null && #root.target instanceof T(java.io.Serializable)"

答案 1 :(得分:0)

以上建议无效。 #root.target是正在执行的目标对象(在本例中为服务对象)。由于服务对象不可序列化,因此该对象似乎可以工作,因此有关对象将不会被缓存,而其他任何对象也将不会被缓存。

您需要使用结果变量来利用“除非”条件:

@Cacheable(value = "myCache", 
           key = "#t+ '_' + #key", 
           condition = "#key != null"
           unless="!(#result instanceof T(java.io.Serializable))")