Introduce 'value' alias for 'attribute' in @AliasFor
SPR-11512 introduced support for annotation attribute aliases via
@AliasFor, requiring the explicit declaration of the 'attribute'
attribute. However, for aliases within an annotation, this explicit
declaration is unnecessary.
This commit improves the readability of alias pairs declared within an
annotation by introducing a 'value' attribute in @AliasFor that is an
alias for the existing 'attribute' attribute. This allows annotations
such as @ContextConfiguration from the spring-test module to declare
aliases as follows.
public @interface ContextConfiguration {
@AliasFor("locations")
String[] value() default {};
@AliasFor("value")
String[] locations() default {};
// ...
}
Issue: SPR-13289
This commit is contained in:
@@ -714,10 +714,30 @@ public class AnnotationUtilsTests {
|
||||
assertEquals("actual value attribute: ", "/test", synthesizedAgainWebMapping.value());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void synthesizeAnnotationWhereAliasForIsMissingAttributeDeclaration() throws Exception {
|
||||
AliasForWithMissingAttributeDeclaration annotation = AliasForWithMissingAttributeDeclarationClass.class.getAnnotation(AliasForWithMissingAttributeDeclaration.class);
|
||||
exception.expect(AnnotationConfigurationException.class);
|
||||
exception.expectMessage(containsString("@AliasFor declaration on attribute [foo] in annotation"));
|
||||
exception.expectMessage(containsString(AliasForWithMissingAttributeDeclaration.class.getName()));
|
||||
exception.expectMessage(containsString("is missing required 'attribute' value"));
|
||||
synthesizeAnnotation(annotation);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void synthesizeAnnotationWhereAliasForHasDuplicateAttributeDeclaration() throws Exception {
|
||||
AliasForWithDuplicateAttributeDeclaration annotation = AliasForWithDuplicateAttributeDeclarationClass.class.getAnnotation(AliasForWithDuplicateAttributeDeclaration.class);
|
||||
exception.expect(AnnotationConfigurationException.class);
|
||||
exception.expectMessage(containsString("In @AliasFor declared on attribute [foo] in annotation"));
|
||||
exception.expectMessage(containsString(AliasForWithDuplicateAttributeDeclaration.class.getName()));
|
||||
exception.expectMessage(containsString("attribute 'attribute' and its alias 'value' are present with values of [baz] and [bar]"));
|
||||
exception.expectMessage(containsString("but only one is permitted"));
|
||||
synthesizeAnnotation(annotation);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void synthesizeAnnotationWithAttributeAliasForNonexistentAttribute() throws Exception {
|
||||
AliasForNonexistentAttribute annotation =
|
||||
AliasForNonexistentAttributeClass.class.getAnnotation(AliasForNonexistentAttribute.class);
|
||||
AliasForNonexistentAttribute annotation = AliasForNonexistentAttributeClass.class.getAnnotation(AliasForNonexistentAttribute.class);
|
||||
exception.expect(AnnotationConfigurationException.class);
|
||||
exception.expectMessage(containsString("Attribute [foo] in"));
|
||||
exception.expectMessage(containsString(AliasForNonexistentAttribute.class.getName()));
|
||||
@@ -1434,7 +1454,7 @@ public class AnnotationUtilsTests {
|
||||
|
||||
String name();
|
||||
|
||||
@AliasFor(attribute = "path")
|
||||
@AliasFor("path")
|
||||
String value() default "";
|
||||
|
||||
@AliasFor(attribute = "value")
|
||||
@@ -1472,10 +1492,10 @@ public class AnnotationUtilsTests {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface ContextConfig {
|
||||
|
||||
@AliasFor(attribute = "locations")
|
||||
@AliasFor("locations")
|
||||
String value() default "";
|
||||
|
||||
@AliasFor(attribute = "value")
|
||||
@AliasFor("value")
|
||||
String locations() default "";
|
||||
}
|
||||
|
||||
@@ -1483,10 +1503,10 @@ public class AnnotationUtilsTests {
|
||||
@interface BrokenContextConfig {
|
||||
|
||||
// Intentionally missing:
|
||||
// @AliasFor(attribute = "locations")
|
||||
// @AliasFor("locations")
|
||||
String value() default "";
|
||||
|
||||
@AliasFor(attribute = "value")
|
||||
@AliasFor("value")
|
||||
String locations() default "";
|
||||
}
|
||||
|
||||
@@ -1530,10 +1550,32 @@ public class AnnotationUtilsTests {
|
||||
}
|
||||
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface AliasForWithMissingAttributeDeclaration {
|
||||
|
||||
@AliasFor
|
||||
String foo() default "";
|
||||
}
|
||||
|
||||
@AliasForWithMissingAttributeDeclaration
|
||||
static class AliasForWithMissingAttributeDeclarationClass {
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface AliasForWithDuplicateAttributeDeclaration {
|
||||
|
||||
@AliasFor(value = "bar", attribute = "baz")
|
||||
String foo() default "";
|
||||
}
|
||||
|
||||
@AliasForWithDuplicateAttributeDeclaration
|
||||
static class AliasForWithDuplicateAttributeDeclarationClass {
|
||||
}
|
||||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface AliasForNonexistentAttribute {
|
||||
|
||||
@AliasFor(attribute = "bar")
|
||||
@AliasFor("bar")
|
||||
String foo() default "";
|
||||
}
|
||||
|
||||
@@ -1544,7 +1586,7 @@ public class AnnotationUtilsTests {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface AliasForWithoutMirroredAliasFor {
|
||||
|
||||
@AliasFor(attribute = "bar")
|
||||
@AliasFor("bar")
|
||||
String foo() default "";
|
||||
|
||||
String bar() default "";
|
||||
@@ -1571,10 +1613,10 @@ public class AnnotationUtilsTests {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface AliasForAttributeOfDifferentType {
|
||||
|
||||
@AliasFor(attribute = "bar")
|
||||
@AliasFor("bar")
|
||||
String[] foo() default "";
|
||||
|
||||
@AliasFor(attribute = "foo")
|
||||
@AliasFor("foo")
|
||||
boolean bar() default true;
|
||||
}
|
||||
|
||||
@@ -1599,10 +1641,10 @@ public class AnnotationUtilsTests {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@interface AliasForAttributeWithDifferentDefaultValue {
|
||||
|
||||
@AliasFor(attribute = "bar")
|
||||
@AliasFor("bar")
|
||||
String foo() default "X";
|
||||
|
||||
@AliasFor(attribute = "foo")
|
||||
@AliasFor("foo")
|
||||
String bar() default "Z";
|
||||
}
|
||||
|
||||
|
||||
@@ -32,9 +32,9 @@ import org.springframework.core.annotation.AliasFor;
|
||||
|
||||
String name();
|
||||
|
||||
@AliasFor(attribute = "path")
|
||||
@AliasFor("path")
|
||||
String value() default "";
|
||||
|
||||
@AliasFor(attribute = "value")
|
||||
@AliasFor("value")
|
||||
String path() default "";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user