重新序列化程序处理java.util.Optional(Spring数据Redis)

重新序列化程序处理java.util.Optional(Spring数据Redis),java,redis,spring-data,spring-data-redis,Java,Redis,Spring Data,Spring Data Redis,您好,我想使用Redis作为缓存提供程序,但不幸的是,Redis序列化程序(Json,字符串)不支持java.util.Optional 我认为一些代码行可以更好地解释它: @Cacheable("test) public Optional<Account> getAccount(String accountId){ // ... call to some service or rest api } @Cacheable(“测试”) 公共可选getAccount(字符串acco

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

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

@Cacheable("test)
public Optional<Account> getAccount(String accountId){
  // ... call to some service or rest api
}
@Cacheable(“测试”)
公共可选getAccount(字符串accountId){
//…调用某个服务或rest api
}
Optional无法由默认java序列化程序序列化,我还没有想出如何告诉JsonSerializer处理Optional。这将如何工作?摆脱Optional对我来说并不是一个真正的选项。

简而言之: 没有现成的支持

解释 Spring Cache(它是
Spring context
的一部分)以本机方式存储
@Cacheable
方法返回的值。当使用诸如
HashMap
、Guava或EhCache(无复制)之类的内存缓存时,这一功能可以正常工作。没有进一步的取消装箱。
可选
可以在缓存中具有不同的语义。
可选。isPresent()==false
可能表示值不在缓存中,也可能表示根本没有可用值

但是,有两种选择:

  • 创建一个自己的序列化程序(基于JDK序列化程序),在其中对
    Optional
  • 基于
    CacheAspectSupport
    创建您自己的
    CacheInterceptor
    ,但是您需要调整代理连接,并且很可能需要禁用默认的
    CacheInterceptor

  • HTH,Mark

    您好,谢谢您的回复。非常不幸:)我正在考虑使用AspectJ this(将@Cacheable放在一个私有方法上,将结果包装成可选项),我认为这可能也是一个选项。@jeven我也按照您的建议做了。真糟糕!