Skip to content

Commit da11261

Browse files
committed
SpringCacheAnnotationParser properly accepts empty @caching annotation
Issue: SPR-14162
1 parent 836a321 commit da11261

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ protected Collection<CacheOperation> parseCacheAnnotations(DefaultCacheConfig ca
8787
if (!cachings.isEmpty()) {
8888
ops = lazyInit(ops);
8989
for (Caching caching : cachings) {
90-
ops.addAll(parseCachingAnnotation(ae, cachingConfig, caching));
90+
Collection<CacheOperation> cachingOps = parseCachingAnnotation(ae, cachingConfig, caching);
91+
if (cachingOps != null) {
92+
ops.addAll(cachingOps);
93+
}
9194
}
9295
}
9396

spring-context/src/test/java/org/springframework/cache/annotation/AnnotationCacheOperationSourceTests.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class AnnotationCacheOperationSourceTests {
4949
@Rule
5050
public final ExpectedException exception = ExpectedException.none();
5151

52-
private AnnotationCacheOperationSource source = new AnnotationCacheOperationSource();
52+
private final AnnotationCacheOperationSource source = new AnnotationCacheOperationSource();
5353

5454

5555
private Collection<CacheOperation> getOps(Class<?> target, String name, int expectedNumberOfOperations) {
@@ -85,6 +85,11 @@ public void caching() throws Exception {
8585
assertTrue(it.next() instanceof CacheEvictOperation);
8686
}
8787

88+
@Test
89+
public void emptyCaching() throws Exception {
90+
Collection<CacheOperation> ops = getOps(AnnotatedClass.class, "emptyCaching", 0);
91+
}
92+
8893
@Test
8994
public void singularStereotype() throws Exception {
9095
Collection<CacheOperation> ops = getOps(AnnotatedClass.class, "singleStereotype", 1);
@@ -272,17 +277,20 @@ public void partialClassLevelWithNoCustomization() {
272277
assertSharedConfig(cacheOperation, "classKeyGenerator", "classCacheManager", "", "classCacheName");
273278
}
274279

280+
275281
private void assertSharedConfig(CacheOperation actual, String keyGenerator, String cacheManager,
276-
String cacheResolver, String... cacheNames) {
282+
String cacheResolver, String... cacheNames) {
283+
277284
assertEquals("Wrong key manager", keyGenerator, actual.getKeyGenerator());
278285
assertEquals("Wrong cache manager", cacheManager, actual.getCacheManager());
279286
assertEquals("Wrong cache resolver", cacheResolver, actual.getCacheResolver());
280287
assertEquals("Wrong number of cache names", cacheNames.length, actual.getCacheNames().size());
281288
Arrays.stream(cacheNames).forEach(
282-
cacheName -> assertTrue("Cache '" + cacheName + "' not found in " + actual.getCacheNames(),
283-
actual.getCacheNames().contains(cacheName)));
289+
cacheName -> assertTrue("Cache '" + cacheName + "' not found in " + actual.getCacheNames(),
290+
actual.getCacheNames().contains(cacheName)));
284291
}
285292

293+
286294
private static class AnnotatedClass {
287295

288296
@Cacheable("test")
@@ -298,6 +306,10 @@ public void multiple() {
298306
public void caching() {
299307
}
300308

309+
@Caching
310+
public void emptyCaching() {
311+
}
312+
301313
@Cacheable(cacheNames = "test", keyGenerator = "custom")
302314
public void customKeyGenerator() {
303315
}
@@ -361,6 +373,7 @@ public void noCacheNameSpecified() {
361373
}
362374
}
363375

376+
364377
@CacheConfig(cacheNames = "classCacheName",
365378
keyGenerator = "classKeyGenerator",
366379
cacheManager = "classCacheManager", cacheResolver = "classCacheResolver")
@@ -383,6 +396,7 @@ public void methodLevelCacheResolver() {
383396
}
384397
}
385398

399+
386400
@CacheConfigFoo
387401
private static class AnnotatedClassWithCustomDefault {
388402

@@ -391,6 +405,7 @@ public void methodLevelCacheName() {
391405
}
392406
}
393407

408+
394409
@CacheConfig(cacheNames = "classCacheName",
395410
keyGenerator = "classKeyGenerator",
396411
cacheManager = "classCacheManager")
@@ -409,6 +424,7 @@ public void noCustomization() {
409424
}
410425
}
411426

427+
412428
@CacheConfigFoo
413429
@CacheConfig(cacheNames = "myCache") // multiple sources
414430
private static class MultipleCacheConfig {
@@ -418,48 +434,58 @@ public void multipleCacheConfig() {
418434
}
419435
}
420436

437+
421438
@Retention(RetentionPolicy.RUNTIME)
422439
@Target(ElementType.METHOD)
423440
@Cacheable("foo")
424441
public @interface CacheableFoo {
425442
}
426443

444+
427445
@Retention(RetentionPolicy.RUNTIME)
428446
@Target(ElementType.METHOD)
429447
@Cacheable(cacheNames = "foo", keyGenerator = "custom")
430448
public @interface CacheableFooCustomKeyGenerator {
431449
}
432450

451+
433452
@Retention(RetentionPolicy.RUNTIME)
434453
@Target(ElementType.METHOD)
435454
@Cacheable(cacheNames = "foo", cacheManager = "custom")
436455
public @interface CacheableFooCustomCacheManager {
437456
}
438457

458+
439459
@Retention(RetentionPolicy.RUNTIME)
440460
@Target(ElementType.METHOD)
441461
@Cacheable(cacheNames = "foo", cacheResolver = "custom")
442462
public @interface CacheableFooCustomCacheResolver {
443463
}
444464

465+
445466
@Retention(RetentionPolicy.RUNTIME)
446467
@Target(ElementType.METHOD)
447468
@CacheEvict("foo")
448469
public @interface EvictFoo {
449470
}
450471

472+
451473
@Retention(RetentionPolicy.RUNTIME)
452474
@Target(ElementType.METHOD)
453475
@CacheEvict("bar")
454476
public @interface EvictBar {
455477
}
456478

479+
457480
@Retention(RetentionPolicy.RUNTIME)
458481
@Target(ElementType.TYPE)
459-
@CacheConfig(keyGenerator = "classKeyGenerator", cacheManager = "classCacheManager", cacheResolver = "classCacheResolver")
482+
@CacheConfig(keyGenerator = "classKeyGenerator",
483+
cacheManager = "classCacheManager",
484+
cacheResolver = "classCacheResolver")
460485
public @interface CacheConfigFoo {
461486
}
462487

488+
463489
@Retention(RetentionPolicy.RUNTIME)
464490
@Target({ ElementType.METHOD, ElementType.TYPE })
465491
@Cacheable(cacheNames = "shadowed cache name", key = "shadowed key")
@@ -475,6 +501,7 @@ public void multipleCacheConfig() {
475501
String key() default "";
476502
}
477503

504+
478505
@Retention(RetentionPolicy.RUNTIME)
479506
@Target({ ElementType.METHOD, ElementType.TYPE })
480507
@CacheEvict(cacheNames = "shadowed cache name", key = "shadowed key")
@@ -490,4 +517,4 @@ public void multipleCacheConfig() {
490517
String key() default "";
491518
}
492519

493-
}
520+
}

0 commit comments

Comments
 (0)