mirror of
https://github.com/spring-projects/spring-framework.git
synced 2026-09-23 22:59:03 +00:00
Prior to this commit, ReactiveCachingHandler.processCacheEvicts() adapted every reactive return value via Mono.from(), which subscribes for only the first element and cancels the upstream Publisher. For a @CacheEvict method that returns a Flux, this silently truncated the returned sequence to its first element. In addition, the `#result` variable in `condition` SpEL expressions was bound to only that first emitted element. To address that, this commit mirrors the existing multi-value handling in processPutRequest(). When the adapter reports isMultiValue(), a side Subscriber is subscribed via publish().refCount(2) that exhausts the Flux and collects its values into a List for eviction, while the original, unmodified Flux is returned to the caller. Consequently, the `#result` variable in `condition` SpEL expressions for a Flux-returning @CacheEvict method is now the full List of emitted elements rather than just the first element, making it consistent with @Cacheable and @CachePut. This commit also improves spr14235AdaptsToReactorFlux() in CacheReproTests. Previously it exercised @CacheEvict only with a single-element Flux and never asserted on the returned sequence. Now it uses a multi-element Flux and verifies that all elements are both returned to the caller and visible to the `condition` expression. Last but not least, this commit documents the aforementioned `#result`/Flux semantics in @CacheEvict's Javadoc and in the reference manual, since both were previously invalid or incomplete for this scenario. Closes gh-37309