You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebFlux中@Cacheable的unless配置:避免缓存空Mono<List>结果

WebFlux下@Cacheable避免缓存空List的写法

首先明确:这里的#result确实是**Mono<List>**类型,和你的方法返回值完全一致——Spring Cache在处理反应式返回值(Mono/Flux)时,会直接把反应式对象作为缓存的目标,不会自动解包里面的内容。

要实现“返回空List时不缓存”的需求,你需要用Spring表达式语言(SpEL)调用Mono的操作符来判断内部List的状态,具体写法如下:

// 注意:原代码里的getItems()会递归调用自己,建议重命名实际WebClient调用的方法,比如getItemsFromWebClient
@Cacheable(value = "items", unless = "#result.map(list -> list.isEmpty()).defaultIfEmpty(true)")
public Mono<List<Item>> getItems() {
    return getItemsFromWebClient().cache();
}

写法说明:

  • #result.map(list -> list.isEmpty()):把Mono<List>转换成Mono,用来判断内部的List是否为空。
  • defaultIfEmpty(true):处理Mono本身没有发射任何值的场景(比如WebClient调用返回空响应体,导致Mono没有元素),这种情况也不缓存。
  • unless的逻辑是:当表达式结果为true时,跳过缓存。所以当List为空或Mono无值时,都不会缓存结果。

如果你的业务场景中,WebClient调用一定会返回一个List(即使是空的),可以简化写法,去掉defaultIfEmpty(true):

@Cacheable(value = "items", unless = "#result.map(list -> list.isEmpty())")

内容的提问来源于stack exchange,提问作者jdiaz4517

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:55:48