2

您好我想使用 Redis 作为缓存提供程序,但不幸的是 redis 序列化程序(Json,String)不支持 java.util.Optional

我认为一些代码行可以更好地解释它:

@Cacheable("test)
public Optional<Account> getAccount(String accountId){
  // ... call to some service or rest api
}

Optional 不能被默认的 java 序列化器序列化,我还没有弄清楚如何告诉 JsonSerializer 来处理 Optional。这将如何运作?摆脱 Optional 对我来说听起来并不是一个选择。

4

1 回答 1

2

简而言之:

没有开箱即用的支持。

解释

Spring Cache(它是 的一部分spring-context)本地存储@Cacheable方法返回的值。HashMap这在使用内存缓存(如Guava 或 EhCache(无复制))时效果很好。没有进一步的拆箱。Optional在缓存中可以有不同的语义。Optional.isPresent() == false可能意味着该值不在缓存中,也可能意味着根本没有可用的值。

但是有两种选择:

  1. 创建一个自己的序列化程序(基于 JDK 序列化程序),您可以在其中实施特殊处理Optional<T>
  2. 根据创建您自己CacheInterceptor的,CacheAspectSupport但随后您需要调整代理接线,并且很可能您需要禁用默认值CacheInterceptor

HTH,马克

于 2015-11-12T07:06:00.013 回答