【问题标题】:RedisSerializer handling java.util.Optional (Spring Data Redis)RedisSerializer 处理 java.util.Optional (Spring Data Redis)
【发布时间】:2016-02-12 12:55:44
【问题描述】:

您好,我想使用 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 对我来说听起来并不是一个选择。

【问题讨论】:

    标签: java redis spring-data spring-data-redis


    【解决方案1】:

    简而言之:

    没有开箱即用的支持。

    说明

    Spring Cache(它是spring-context 的一部分)本地存储@Cacheable 方法返回的值。当使用HashMap、Guava 或 EhCache 等内存缓存(没有复制)时,这可以正常工作。没有进一步的拆箱。 Optional 在缓存中可以有不同的语义。 Optional.isPresent() == false 可能表示该值不在缓存中,也可能表示根本没有可用的值。

    但是有两种选择:

    1. 创建自己的序列化程序(基于 JDK 序列化程序),在其中对 Optional&lt;T&gt; 实施特殊处理
    2. 基于CacheAspectSupport 创建您自己的CacheInterceptor,但随后您需要调整代理接线,并且很可能您需要禁用默认的CacheInterceptor

    HTH,马克

    【讨论】:

    • 您好,感谢您的回复。不过真的很不幸 :) 我正在考虑使用 AspectJ(将 @Cacheable 放在将结果包装成 Optional 的私有方法上)我认为这也可能是一个选项。
    • @jeven 我也很喜欢你的建议。真的很糟糕!
    猜你喜欢
    • 2021-09-13
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2016-03-18
    • 2014-11-19
    • 2013-02-25
    相关资源
    最近更新 更多