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

Cache object only if it is Serializable

我通过在具有以下声明的方法上使用 @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);
}

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

我想知道是否可以仅在对象可序列化时才缓存对象以避免此异常。

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

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

您可以指定条件:

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

上面的建议行不通。 #root.target 是正在执行的目标对象(在本例中是服务对象)。所以它似乎可以工作,因为服务对象不可序列化,所以有问题的对象不会被缓存,但其他任何东西也不会。

您需要使用结果变量来利用 "unless" 条件:

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