Use RepeatableContainers.none() in AnnotationUtils

Update `AnnotationUtils` so that `RepeatableContainers.none()` is used
when performing an exhaustive search for merged annotations. These
parameters were accidentally removed in commit 210b1789 and weren't
caught earlier because we were missing a test.

Closes gh-22702
This commit is contained in:
Phillip Webb 2019-03-28 14:32:30 -07:00
parent 800cbf2524
commit f273fa990c
2 changed files with 32 additions and 4 deletions

View File

@ -197,7 +197,8 @@ public abstract class AnnotationUtils {
return null; return null;
} }
// Exhaustive retrieval of merged annotations... // Exhaustive retrieval of merged annotations...
return MergedAnnotations.from(annotation) return MergedAnnotations.from(null, new Annotation[] {annotation},
RepeatableContainers.none(), AnnotationFilter.PLAIN)
.get(annotationType).withNonMergedAttributes() .get(annotationType).withNonMergedAttributes()
.synthesize(AnnotationUtils::isSingleLevelPresent).orElse(null); .synthesize(AnnotationUtils::isSingleLevelPresent).orElse(null);
} }
@ -492,7 +493,8 @@ public abstract class AnnotationUtils {
return annotatedElement.getDeclaredAnnotation(annotationType); return annotatedElement.getDeclaredAnnotation(annotationType);
} }
// Exhaustive retrieval of merged annotations... // Exhaustive retrieval of merged annotations...
return MergedAnnotations.from(annotatedElement, SearchStrategy.INHERITED_ANNOTATIONS) return MergedAnnotations.from(annotatedElement, SearchStrategy.INHERITED_ANNOTATIONS,
RepeatableContainers.none(), AnnotationFilter.PLAIN)
.get(annotationType).withNonMergedAttributes() .get(annotationType).withNonMergedAttributes()
.synthesize(MergedAnnotation::isPresent).orElse(null); .synthesize(MergedAnnotation::isPresent).orElse(null);
} }
@ -523,7 +525,8 @@ public abstract class AnnotationUtils {
return method.getDeclaredAnnotation(annotationType); return method.getDeclaredAnnotation(annotationType);
} }
// Exhaustive retrieval of merged annotations... // Exhaustive retrieval of merged annotations...
return MergedAnnotations.from(method, SearchStrategy.EXHAUSTIVE) return MergedAnnotations.from(method, SearchStrategy.EXHAUSTIVE,
RepeatableContainers.none(), AnnotationFilter.PLAIN)
.get(annotationType).withNonMergedAttributes() .get(annotationType).withNonMergedAttributes()
.synthesize(MergedAnnotation::isPresent).orElse(null); .synthesize(MergedAnnotation::isPresent).orElse(null);
} }
@ -561,7 +564,8 @@ public abstract class AnnotationUtils {
return clazz.getDeclaredAnnotation(annotationType); return clazz.getDeclaredAnnotation(annotationType);
} }
// Exhaustive retrieval of merged annotations... // Exhaustive retrieval of merged annotations...
return MergedAnnotations.from(clazz, SearchStrategy.EXHAUSTIVE) return MergedAnnotations.from(clazz, SearchStrategy.EXHAUSTIVE,
RepeatableContainers.none(), AnnotationFilter.PLAIN)
.get(annotationType).withNonMergedAttributes() .get(annotationType).withNonMergedAttributes()
.synthesize(MergedAnnotation::isPresent).orElse(null); .synthesize(MergedAnnotation::isPresent).orElse(null);
} }

View File

@ -979,6 +979,13 @@ public class AnnotationUtilsTests {
assertEquals("value from synthesized component: ", "webController", synthesizedComponent.value()); assertEquals("value from synthesized component: ", "webController", synthesizedComponent.value());
} }
@Test // gh-22702
public void findAnnotationWithRepeatablesElements() {
assertNull(AnnotationUtils.findAnnotation(TestRepeatablesClass.class,
TestRepeatable.class));
assertNotNull(AnnotationUtils.findAnnotation(TestRepeatablesClass.class,
TestRepeatableContainer.class));
}
@SafeVarargs @SafeVarargs
static <T> T[] asArray(T... arr) { static <T> T[] asArray(T... arr) {
@ -1808,4 +1815,21 @@ public class AnnotationUtilsTests {
interface ContextConfigMismatch { interface ContextConfigMismatch {
} }
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(TestRepeatableContainer.class)
static @interface TestRepeatable {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
static @interface TestRepeatableContainer {
TestRepeatable[] value();
}
@TestRepeatable("a")
@TestRepeatable("b")
static class TestRepeatablesClass {
}
} }