diff --git a/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotations.java b/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotations.java index dc3452e70f99..55dff9086f74 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotations.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotations.java @@ -25,6 +25,7 @@ import java.util.stream.Stream; import org.springframework.lang.Nullable; +import org.springframework.util.Assert; /** * Provides access to a collection of merged annotations, usually obtained @@ -345,6 +346,8 @@ static MergedAnnotations from(AnnotatedElement element, SearchStrategy searchStr static MergedAnnotations from(AnnotatedElement element, SearchStrategy searchStrategy, RepeatableContainers repeatableContainers, AnnotationFilter annotationFilter) { + Assert.notNull(repeatableContainers, "RepeatableContainers must not be null"); + Assert.notNull(annotationFilter, "AnnotationFilter must not be null"); return TypeMappedAnnotations.from(element, searchStrategy, repeatableContainers, annotationFilter); } @@ -405,6 +408,8 @@ static MergedAnnotations from(Object source, Annotation[] annotations, Repeatabl static MergedAnnotations from(Object source, Annotation[] annotations, RepeatableContainers repeatableContainers, AnnotationFilter annotationFilter) { + Assert.notNull(repeatableContainers, "RepeatableContainers must not be null"); + Assert.notNull(annotationFilter, "AnnotationFilter must not be null"); return TypeMappedAnnotations.from(source, annotations, repeatableContainers, annotationFilter); } diff --git a/spring-core/src/test/java/org/springframework/core/annotation/MergedAnnotationsTests.java b/spring-core/src/test/java/org/springframework/core/annotation/MergedAnnotationsTests.java index 959f7f22ea29..e9e3586bb6a4 100644 --- a/spring-core/src/test/java/org/springframework/core/annotation/MergedAnnotationsTests.java +++ b/spring-core/src/test/java/org/springframework/core/annotation/MergedAnnotationsTests.java @@ -53,6 +53,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.entry; @@ -73,6 +74,26 @@ */ class MergedAnnotationsTests { + @Test + void fromPreconditions() { + SearchStrategy strategy = SearchStrategy.DIRECT; + RepeatableContainers containers = RepeatableContainers.standardRepeatables(); + + assertThatIllegalArgumentException() + .isThrownBy(() -> MergedAnnotations.from(getClass(), strategy, null, AnnotationFilter.PLAIN)) + .withMessage("RepeatableContainers must not be null"); + assertThatIllegalArgumentException() + .isThrownBy(() -> MergedAnnotations.from(getClass(), strategy, containers, null)) + .withMessage("AnnotationFilter must not be null"); + + assertThatIllegalArgumentException() + .isThrownBy(() -> MergedAnnotations.from(getClass(), new Annotation[0], null, AnnotationFilter.PLAIN)) + .withMessage("RepeatableContainers must not be null"); + assertThatIllegalArgumentException() + .isThrownBy(() -> MergedAnnotations.from(getClass(), new Annotation[0], containers, null)) + .withMessage("AnnotationFilter must not be null"); + } + @Test void streamWhenFromNonAnnotatedClass() { assertThat(MergedAnnotations.from(NonAnnotatedClass.class).