如果它是空的,Spring 4.3如何解除可选的缓存

时间:2018-04-27 13:56:52

标签: spring caching optional

我的团队一直在Spring中使用@Cachable注释并缓存Optional<>在Java中。我们刚刚升级到Spring 4.3并开始出错,因为或者缓存不允许空值而Spring正在解包Optional并尝试在它为空时放入null。

我尝试查看文档,但我无法找到解释Spring进入缓存时的行为的任何地方,找到null并且应该返回一个Optional<&gt ;.谁能提供一些背景;它会将它转换为空的可选项还是会抛出任何错误?

3 个答案:

答案 0 :(得分:1)

围绕version 4.3.3.RELEASE的Spring Cache Abstraction添加了对Optional的支持。有关示例,请参阅此条件缓存部分。

  

缓存抽象支持java.util.Optional,仅在其存在时将其内容用作缓存值。 #result始终引用业务实体,从不在受支持的包装器上,因此可以按如下方式重写上一个示例:

@Cacheable(cacheNames="book", condition="#name.length < 32", unless="#result.hardback")
public Optional<Book> findBook(String name)
  

请注意,结果仍然是指Book而不是Optional。

see this SO post

答案 1 :(得分:1)

我测试了这个,Spring会将null值放入Optional。

答案 2 :(得分:1)

有点晚了,我知道。我发现这个问题正在寻找同样的问题。

我的母语不是英语,因此对“除非”的含义感到困惑。最后我设法解决了它,@Anand 建议:

<块引用>

除非 = "#result == null"

像这样:

@Cacheable(value = "clients", key = "#p0.concat(#p1)", unless = "#result == null")
Optional<Client> findByClientAndProfile(String idClient, String profile);