Spring 可缓存 - 使用 SpEL 过滤掉空集合

Posted

技术标签:

【中文标题】Spring 可缓存 - 使用 SpEL 过滤掉空集合【英文标题】:Spring cacheable - filter out empty collections using SpEL 【发布时间】:2014-11-16 15:12:09 【问题描述】:

我想知道有没有办法使用 SpEL 来过滤掉空集合之类的值。

我的缓存当前过滤掉了空值:

  @Cacheable(value = "groupIdToGroupNames",unless = "#result == null")
   public Map<Long, Collection<String>> findAllBySearchCustomerKey(final long groupId) 
    return idToNameClient.findAllGroupMembersById(groupId);
    

我正在尝试找到一种方法来过滤掉大小为 0 但不为空的组。 有没有办法通过使用@Cacheable 的参数来做到这一点?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这对我有用

@Cacheable(cacheNames = "recordCache", key = "#list", unless="#result == null or #result.size() == 0")

【讨论】:

【参考方案2】:

unless = "#result==null or #result.isEmpty()" 为我工作。

【讨论】:

这似乎并没有比接受的 5 岁答案添加任何新内容。它可能会被审稿人删除。如果您认为您的答案会产生重大影响,您可能需要添加说明,说明这比现有答案更好。 可能这对我来说更具可读性,而不是#result.size()==0。也同意@nvoigt,我们应该在任何答案上添加解释。 增加了很多!方法isEmpty 可能最终会做的不仅仅是简单的检查,而且对于可读性也是值得的【参考方案3】:

类似的东西

unless = "#result==null or #result.size()==0"

【讨论】:

我刚刚添加了它。 SpEL 新手:) 谢谢!【参考方案4】:

仅举一个例子(Artem Bilan 的答案是有效的)。我的函数可以返回我的对象​​的 Optional.ofEmpty 或 Optional

@Cacheable(value = "myCache", unless = "#result == null", key = "@myDao.cacheKey(#id, #languageCode)")
public Optional<MyDTO> getMyStuff(int id, String languageCode) 
... 

【讨论】:

以上是关于Spring 可缓存 - 使用 SpEL 过滤掉空集合的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 使用 .filter() 过滤掉空列表

Spring Boot Cache SpEL(#result)返回Null

ng-repeat过滤器不过滤掉空值

基于SpEL在Spring Cloud Gateway中实现全维度灰度路由

在 Spring Cloud Dataflow 中引用属性

Spring Boot (24) 使用Spring Cache集成Redis