Spring WebFlux中@Cacheable的unless配置:避免缓存空Mono<List>结果
WebFlux下@Cacheable避免缓存空List的写法
首先明确:这里的#result确实是**Mono<List
要实现“返回空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是否为空。 - >转换成Mono
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
相关产品推荐
相关产品推荐

