仅当对象可序列化时才缓存对象
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))")
我通过在具有以下声明的方法上使用 @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))")