Skip to content

Commit 42e7ade

Browse files
committed
Tolerate unidirectional alias declaration for annotation attribute pair
Closes gh-23834
1 parent dba7bf7 commit 42e7ade

File tree

5 files changed

+69
-167
lines changed

5 files changed

+69
-167
lines changed

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

+10-16
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.LinkedHashSet;
2828
import java.util.List;
2929
import java.util.Map;
30-
import java.util.Objects;
3130
import java.util.Set;
3231
import java.util.function.BiFunction;
3332

@@ -179,30 +178,25 @@ private Method resolveAliasTarget(Method attribute, AliasFor aliasFor, boolean c
179178
}
180179
if (isAliasPair(target) && checkAliasPair) {
181180
AliasFor targetAliasFor = target.getAnnotation(AliasFor.class);
182-
if (targetAliasFor == null) {
183-
throw new AnnotationConfigurationException(String.format(
184-
"%s must be declared as an @AliasFor '%s'.",
185-
StringUtils.capitalize(AttributeMethods.describe(target)),
186-
attribute.getName()));
187-
}
188-
Method mirror = resolveAliasTarget(target, targetAliasFor, false);
189-
if (!mirror.equals(attribute)) {
190-
throw new AnnotationConfigurationException(String.format(
191-
"%s must be declared as an @AliasFor '%s', not '%s'.",
192-
StringUtils.capitalize(AttributeMethods.describe(target)),
193-
attribute.getName(), mirror.getName()));
181+
if (targetAliasFor != null) {
182+
Method mirror = resolveAliasTarget(target, targetAliasFor, false);
183+
if (!mirror.equals(attribute)) {
184+
throw new AnnotationConfigurationException(String.format(
185+
"%s must be declared as an @AliasFor '%s', not '%s'.",
186+
StringUtils.capitalize(AttributeMethods.describe(target)),
187+
attribute.getName(), mirror.getName()));
188+
}
194189
}
195190
}
196191
return target;
197192
}
198193

199194
private boolean isAliasPair(Method target) {
200-
return target.getDeclaringClass().equals(this.annotationType);
195+
return (this.annotationType == target.getDeclaringClass());
201196
}
202197

203198
private boolean isCompatibleReturnType(Class<?> attributeType, Class<?> targetType) {
204-
return Objects.equals(attributeType, targetType) ||
205-
Objects.equals(attributeType, targetType.getComponentType());
199+
return (attributeType == targetType || attributeType == targetType.getComponentType());
206200
}
207201

208202
private void processAliases() {

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,7 @@ static class MetaCycleAnnotatedClass {
12001200
@AliasFor("basePackages")
12011201
String[] value() default {};
12021202

1203-
@AliasFor("value")
1203+
// Intentionally no alias declaration for "value"
12041204
String[] basePackages() default {};
12051205

12061206
Filter[] excludeFilters() default {};
@@ -1485,15 +1485,15 @@ class ForAnnotationsClass {
14851485
}
14861486

14871487
@Retention(RetentionPolicy.RUNTIME)
1488-
static @interface ValueAttribute {
1488+
@interface ValueAttribute {
14891489

14901490
String[] value();
14911491

14921492
}
14931493

14941494
@Retention(RetentionPolicy.RUNTIME)
14951495
@ValueAttribute("FromValueAttributeMeta")
1496-
static @interface ValueAttributeMeta {
1496+
@interface ValueAttributeMeta {
14971497

14981498
@AliasFor("alias")
14991499
String[] value() default {};
@@ -1505,7 +1505,7 @@ class ForAnnotationsClass {
15051505

15061506
@Retention(RetentionPolicy.RUNTIME)
15071507
@ValueAttributeMeta("FromValueAttributeMetaMeta")
1508-
static @interface ValueAttributeMetaMeta {
1508+
@interface ValueAttributeMetaMeta {
15091509
}
15101510

15111511
@ValueAttributeMetaMeta

0 commit comments

Comments
 (0)