Skip to content

Commit b37390b

Browse files
committed
Restore javax meta-annotation lookup behavior
Closes gh-22957
1 parent fd159ad commit b37390b

File tree

3 files changed

+64
-6
lines changed

3 files changed

+64
-6
lines changed

spring-core/spring-core.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ dependencies {
8080
optional("io.netty:netty-buffer")
8181
testCompile("io.projectreactor:reactor-test")
8282
testCompile("org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}")
83+
testCompile("com.google.code.findbugs:jsr305:3.0.2")
8384
testCompile("org.xmlunit:xmlunit-matchers:2.6.2")
8485
testCompile("javax.xml.bind:jaxb-api:2.3.1")
8586
testCompile("com.fasterxml.woodstox:woodstox-core:5.2.0") {

spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,7 +956,7 @@ else if (annotatedElement instanceof Member) {
956956
return false;
957957
}
958958
String name = clazz.getName();
959-
return (name.startsWith("java") || name.startsWith("org.springframework.lang."));
959+
return (name.startsWith("java.") || name.startsWith("org.springframework.lang."));
960960
}
961961

962962
/**

spring-core/src/test/java/org/springframework/core/annotation/AnnotatedElementUtilsTests.java

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
1717
package org.springframework.core.annotation;
1818

1919
import java.lang.annotation.Annotation;
20+
import java.lang.annotation.Documented;
2021
import java.lang.annotation.ElementType;
2122
import java.lang.annotation.Inherited;
2223
import java.lang.annotation.Retention;
@@ -28,14 +29,18 @@
2829
import java.util.Date;
2930
import java.util.List;
3031
import java.util.Set;
32+
import javax.annotation.Nonnull;
33+
import javax.annotation.ParametersAreNonnullByDefault;
3134
import javax.annotation.Resource;
35+
import javax.annotation.meta.When;
3236

3337
import org.junit.Ignore;
3438
import org.junit.Rule;
3539
import org.junit.Test;
3640
import org.junit.internal.ArrayComparisonFailure;
3741
import org.junit.rules.ExpectedException;
3842

43+
import org.springframework.lang.NonNullApi;
3944
import org.springframework.stereotype.Component;
4045
import org.springframework.stereotype.Indexed;
4146
import org.springframework.util.Assert;
@@ -118,6 +123,14 @@ public void hasMetaAnnotationTypesOnClassWithMetaDepth2() {
118123
assertFalse(hasMetaAnnotationTypes(ComposedTransactionalComponentClass.class, ComposedTransactionalComponent.class.getName()));
119124
}
120125

126+
@Test
127+
public void isAnnotatedForPlainTypes() {
128+
assertTrue(isAnnotated(Order.class, Documented.class));
129+
assertTrue(isAnnotated(NonNullApi.class, Documented.class));
130+
assertTrue(isAnnotated(NonNullApi.class, Nonnull.class));
131+
assertTrue(isAnnotated(ParametersAreNonnullByDefault.class, Nonnull.class));
132+
}
133+
121134
@Test
122135
public void isAnnotatedOnNonAnnotatedClass() {
123136
assertFalse(isAnnotated(NonAnnotatedClass.class, TX_NAME));
@@ -147,6 +160,14 @@ public void isAnnotatedOnClassWithMetaDepth2() {
147160
assertTrue(isAnnotated(ComposedTransactionalComponentClass.class, ComposedTransactionalComponent.class.getName()));
148161
}
149162

163+
@Test
164+
public void hasAnnotationForPlainTypes() {
165+
assertTrue(hasAnnotation(Order.class, Documented.class));
166+
assertTrue(hasAnnotation(NonNullApi.class, Documented.class));
167+
assertTrue(hasAnnotation(NonNullApi.class, Nonnull.class));
168+
assertTrue(hasAnnotation(ParametersAreNonnullByDefault.class, Nonnull.class));
169+
}
170+
150171
@Test
151172
public void getAllAnnotationAttributesOnNonAnnotatedClass() {
152173
assertNull(getAllAnnotationAttributes(NonAnnotatedClass.class, TX_NAME));
@@ -207,6 +228,22 @@ public void getAllAnnotationAttributesOnClassWithMultipleComposedAnnotations() {
207228
attributes.get("value"));
208229
}
209230

231+
@Test
232+
public void getAllAnnotationAttributesOnLangType() {
233+
MultiValueMap<String, Object> attributes = getAllAnnotationAttributes(
234+
NonNullApi.class, Nonnull.class.getName());
235+
assertNotNull(attributes);
236+
assertEquals(asList(When.ALWAYS), attributes.get("when"));
237+
}
238+
239+
@Test
240+
public void getAllAnnotationAttributesOnJavaxType() {
241+
MultiValueMap<String, Object> attributes = getAllAnnotationAttributes(
242+
ParametersAreNonnullByDefault.class, Nonnull.class.getName());
243+
assertNotNull(attributes);
244+
assertEquals(asList(When.ALWAYS), attributes.get("when"));
245+
}
246+
210247
@Test
211248
public void getMergedAnnotationAttributesOnClassWithLocalAnnotation() {
212249
Class<?> element = TxConfig.class;
@@ -701,14 +738,33 @@ private void assertWebMapping(AnnotatedElement element) throws ArrayComparisonFa
701738
@Test
702739
public void javaLangAnnotationTypeViaFindMergedAnnotation() throws Exception {
703740
Constructor<?> deprecatedCtor = Date.class.getConstructor(String.class);
704-
assertEquals(deprecatedCtor.getAnnotation(Deprecated.class), findMergedAnnotation(deprecatedCtor, Deprecated.class));
705-
assertEquals(Date.class.getAnnotation(Deprecated.class), findMergedAnnotation(Date.class, Deprecated.class));
741+
assertEquals(deprecatedCtor.getAnnotation(Deprecated.class),
742+
findMergedAnnotation(deprecatedCtor, Deprecated.class));
743+
assertEquals(Date.class.getAnnotation(Deprecated.class),
744+
findMergedAnnotation(Date.class, Deprecated.class));
706745
}
707746

708747
@Test
709748
public void javaxAnnotationTypeViaFindMergedAnnotation() throws Exception {
710-
assertEquals(ResourceHolder.class.getAnnotation(Resource.class), findMergedAnnotation(ResourceHolder.class, Resource.class));
711-
assertEquals(SpringAppConfigClass.class.getAnnotation(Resource.class), findMergedAnnotation(SpringAppConfigClass.class, Resource.class));
749+
assertEquals(ResourceHolder.class.getAnnotation(Resource.class),
750+
findMergedAnnotation(ResourceHolder.class, Resource.class));
751+
assertEquals(SpringAppConfigClass.class.getAnnotation(Resource.class),
752+
findMergedAnnotation(SpringAppConfigClass.class, Resource.class));
753+
}
754+
755+
@Test
756+
public void javaxMetaAnnotationTypeViaFindMergedAnnotation() throws Exception {
757+
assertEquals(ParametersAreNonnullByDefault.class.getAnnotation(Nonnull.class),
758+
findMergedAnnotation(ParametersAreNonnullByDefault.class, Nonnull.class));
759+
assertEquals(ParametersAreNonnullByDefault.class.getAnnotation(Nonnull.class),
760+
findMergedAnnotation(ResourceHolder.class, Nonnull.class));
761+
}
762+
763+
@Test
764+
public void nullableAnnotationTypeViaFindMergedAnnotation() throws Exception {
765+
Method method = TransactionalServiceImpl.class.getMethod("doIt");
766+
assertEquals(method.getAnnotation(Resource.class), findMergedAnnotation(method, Resource.class));
767+
assertEquals(method.getAnnotation(Resource.class), findMergedAnnotation(method, Resource.class));
712768
}
713769

714770
@Test
@@ -1288,6 +1344,7 @@ static class SpringAppConfigClass {
12881344
}
12891345

12901346
@Resource(name = "x")
1347+
@ParametersAreNonnullByDefault
12911348
static class ResourceHolder {
12921349
}
12931350

0 commit comments

Comments
 (0)