A Spring Boot 4.1.1 module whose test suite is the evidence for the article: 19 tests producing 22 transcripts under docs/output/, plus 12 documentation chapters. Findings the build pins: - @EnableCaching has no exposeProxy attribute; the widely-copied @EnableCaching(exposeProxy = true) does not compile. - Two methods sharing a cache name and an argument type share a key space, and one silently serves the other's answers. - beforeInvocation = true is NOT deferred by TransactionAwareCacheManagerProxy on 7.0.9 - doEvict picks evictIfPresent, which the decorator does not intercept. - Four of five invalid declarations start a clean context and throw at the first call. - Caffeine on the classpath silently displaces the simple provider.
30 lines
2.2 KiB
Plaintext
30 lines
2.2 KiB
Plaintext
# Declarations that are rejected, and how late you find out
|
|
|
|
1. key and keyGenerator together
|
|
startup : FAILED - java.lang.IllegalStateException
|
|
Invalid cache annotation configuration on 'public java.lang.String com.ankurm.caching.InvalidDeclarationsTest$BothKeyAndGenerator$Svc.call(java.lang.String)'. Both 'key' and 'keyGenerator' attributes have been set. These attributes are mutually exclusive: either set the SpEL expression used tocompute the key at runtime or set the name of the KeyGenerator bean to use.
|
|
|
|
--- 2. sync = true with unless ---
|
|
startup : clean
|
|
first call: java.lang.IllegalStateException
|
|
A sync=true operation does not support the unless attribute on 'Builder[public java.lang.String com.ankurm.caching.InvalidDeclarationsTest$SyncWithUnless$Svc.call(java.lang.String)] caches=[c] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='#result != null' | sync='true''
|
|
|
|
--- 3. sync = true across two caches ---
|
|
startup : clean
|
|
first call: java.lang.IllegalStateException
|
|
A sync=true operation is restricted to a single cache on 'Builder[public java.lang.String com.ankurm.caching.InvalidDeclarationsTest$SyncTwoCaches$Svc.call(java.lang.String)] caches=[c1, c2] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='true''
|
|
|
|
--- 4. @Cacheable and @CacheEvict on one method ---
|
|
startup : clean
|
|
first call: java.lang.IllegalStateException
|
|
A sync=true operation cannot be combined with other cache operations on 'public java.lang.String com.ankurm.caching.InvalidDeclarationsTest$CacheableAndEvict$Svc.call(java.lang.String)'
|
|
|
|
--- 5. a cache name that spring.cache.cache-names does not declare ---
|
|
startup : clean
|
|
first call: java.lang.IllegalArgumentException
|
|
Cannot find cache named 'unknown' for Builder[public java.lang.String com.ankurm.caching.InvalidDeclarationsTest$UndeclaredCache$Svc.call(java.lang.String)] caches=[unknown] | key='' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'
|
|
|
|
Only the first of these is a compile-time-shaped mistake. The rest start a
|
|
perfectly healthy application and throw on a code path that may not be hit
|
|
for hours.
|