From 725292081e804ce33ac9848796f50e30e793fd25 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Wed, 29 Jul 2015 15:27:06 +0200 Subject: [PATCH] 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 --- .../cache/annotation/CacheEvict.java | 4 +- .../cache/annotation/CachePut.java | 4 +- .../cache/annotation/Cacheable.java | 4 +- .../context/annotation/ComponentScan.java | 8 +-- .../context/annotation/ImportResource.java | 4 +- .../context/annotation/Scope.java | 4 +- .../context/event/EventListener.java | 4 +- .../export/annotation/ManagedResource.java | 4 +- .../core/annotation/AliasFor.java | 16 ++++- .../core/annotation/AnnotationUtils.java | 38 ++++++++++- .../core/annotation/AnnotationUtilsTests.java | 68 +++++++++++++++---- .../NonPublicAliasedAnnotation.java | 4 +- .../messaging/handler/annotation/Header.java | 4 +- .../messaging/handler/annotation/Payload.java | 4 +- .../messaging/simp/annotation/SendToUser.java | 4 +- .../test/context/ActiveProfiles.java | 4 +- .../test/context/ContextConfiguration.java | 4 +- .../test/context/TestExecutionListeners.java | 4 +- .../test/context/TestPropertySource.java | 4 +- .../test/context/jdbc/Sql.java | 4 +- .../transaction/annotation/Transactional.java | 4 +- .../event/TransactionalEventListener.java | 4 +- .../web/bind/annotation/ControllerAdvice.java | 4 +- .../web/bind/annotation/CookieValue.java | 4 +- .../web/bind/annotation/CrossOrigin.java | 4 +- .../web/bind/annotation/MatrixVariable.java | 4 +- .../web/bind/annotation/RequestHeader.java | 4 +- .../web/bind/annotation/RequestMapping.java | 4 +- .../web/bind/annotation/RequestParam.java | 4 +- .../web/bind/annotation/RequestPart.java | 4 +- .../web/bind/annotation/ResponseStatus.java | 4 +- .../bind/annotation/SessionAttributes.java | 4 +- .../bind/annotation/ActionMapping.java | 4 +- .../bind/annotation/RenderMapping.java | 4 +- src/asciidoc/whats-new.adoc | 4 +- 35 files changed, 170 insertions(+), 84 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/CacheEvict.java b/spring-context/src/main/java/org/springframework/cache/annotation/CacheEvict.java index 4a8e030dc1..520ddd6214 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/CacheEvict.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/CacheEvict.java @@ -44,7 +44,7 @@ public @interface CacheEvict { /** * Alias for {@link #cacheNames}. */ - @AliasFor(attribute = "cacheNames") + @AliasFor("cacheNames") String[] value() default {}; /** @@ -55,7 +55,7 @@ public @interface CacheEvict { * @see #value * @see CacheConfig#cacheNames */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] cacheNames() default {}; /** diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/CachePut.java b/spring-context/src/main/java/org/springframework/cache/annotation/CachePut.java index c199439d03..deac117aa8 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/CachePut.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/CachePut.java @@ -50,7 +50,7 @@ public @interface CachePut { /** * Alias for {@link #cacheNames}. */ - @AliasFor(attribute = "cacheNames") + @AliasFor("cacheNames") String[] value() default {}; /** @@ -61,7 +61,7 @@ public @interface CachePut { * @see #value * @see CacheConfig#cacheNames */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] cacheNames() default {}; /** diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/Cacheable.java b/spring-context/src/main/java/org/springframework/cache/annotation/Cacheable.java index 973c3eaa14..9e7697e9bc 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/Cacheable.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/Cacheable.java @@ -55,7 +55,7 @@ public @interface Cacheable { /** * Alias for {@link #cacheNames}. */ - @AliasFor(attribute = "cacheNames") + @AliasFor("cacheNames") String[] value() default {}; /** @@ -66,7 +66,7 @@ public @interface Cacheable { * @see #value * @see CacheConfig#cacheNames */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] cacheNames() default {}; /** diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ComponentScan.java b/spring-context/src/main/java/org/springframework/context/annotation/ComponentScan.java index a147cd1bf0..a1052fd6dc 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ComponentScan.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ComponentScan.java @@ -62,7 +62,7 @@ public @interface ComponentScan { * are needed — for example, {@code @ComponentScan("org.my.pkg")} * instead of {@code @ComponentScan(basePackages = "org.my.pkg")}. */ - @AliasFor(attribute = "basePackages") + @AliasFor("basePackages") String[] value() default {}; /** @@ -72,7 +72,7 @@ public @interface ComponentScan { *

Use {@link #basePackageClasses} for a type-safe alternative to * String-based package names. */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] basePackages() default {}; /** @@ -166,7 +166,7 @@ public @interface ComponentScan { * Alias for {@link #classes}. * @see #classes */ - @AliasFor(attribute = "classes") + @AliasFor("classes") Class[] value() default {}; /** @@ -190,7 +190,7 @@ public @interface ComponentScan { * @see #value * @see #type */ - @AliasFor(attribute = "value") + @AliasFor("value") Class[] classes() default {}; /** diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ImportResource.java b/spring-context/src/main/java/org/springframework/context/annotation/ImportResource.java index 97005bbb7d..2cc78ddc5f 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ImportResource.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ImportResource.java @@ -59,7 +59,7 @@ public @interface ImportResource { * @see #locations * @see #reader */ - @AliasFor(attribute = "locations") + @AliasFor("locations") String[] value() default {}; /** @@ -72,7 +72,7 @@ public @interface ImportResource { * @see #value * @see #reader */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] locations() default {}; /** diff --git a/spring-context/src/main/java/org/springframework/context/annotation/Scope.java b/spring-context/src/main/java/org/springframework/context/annotation/Scope.java index 98488e8610..b0daf8c0ce 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/Scope.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/Scope.java @@ -61,7 +61,7 @@ public @interface Scope { * Alias for {@link #scopeName}. * @see #scopeName */ - @AliasFor(attribute = "scopeName") + @AliasFor("scopeName") String value() default ""; /** @@ -75,7 +75,7 @@ public @interface Scope { * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION * @see #value */ - @AliasFor(attribute = "value") + @AliasFor("value") String scopeName() default ""; /** diff --git a/spring-context/src/main/java/org/springframework/context/event/EventListener.java b/spring-context/src/main/java/org/springframework/context/event/EventListener.java index 45dd91ebb5..b393b66f4c 100644 --- a/spring-context/src/main/java/org/springframework/context/event/EventListener.java +++ b/spring-context/src/main/java/org/springframework/context/event/EventListener.java @@ -69,7 +69,7 @@ public @interface EventListener { /** * Alias for {@link #classes}. */ - @AliasFor(attribute = "classes") + @AliasFor("classes") Class[] value() default {}; /** @@ -79,7 +79,7 @@ public @interface EventListener { * attribute is specified with multiple values, the annotated method * must not declare any parameters. */ - @AliasFor(attribute = "value") + @AliasFor("value") Class[] classes() default {}; /** diff --git a/spring-context/src/main/java/org/springframework/jmx/export/annotation/ManagedResource.java b/spring-context/src/main/java/org/springframework/jmx/export/annotation/ManagedResource.java index 0dd1fb7ad7..555a65d48f 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/annotation/ManagedResource.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/annotation/ManagedResource.java @@ -49,10 +49,10 @@ public @interface ManagedResource { /** * Alias for the {@link #objectName} attribute, for simple default usage. */ - @AliasFor(attribute = "objectName") + @AliasFor("objectName") String value() default ""; - @AliasFor(attribute = "value") + @AliasFor("value") String objectName() default ""; String description() default ""; diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AliasFor.java b/spring-core/src/main/java/org/springframework/core/annotation/AliasFor.java index 9832f094b8..8a9a971748 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AliasFor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AliasFor.java @@ -120,9 +120,21 @@ import java.lang.annotation.Target; public @interface AliasFor { /** - * The name of the attribute that this attribute is an alias for. + * Alias for {@link #attribute}. + *

Intended to be used instead of {@link #attribute} when {@link #annotation} + * is not declared — for example: {@code @AliasFor("value")} instead of + * {@code @AliasFor(attribute = "value")}. */ - String attribute(); + @AliasFor("attribute") + String value() default ""; + + /** + * The name of the attribute that this attribute is an alias for. + * @see #value + */ + @AliasFor("value") + String attribute() default ""; + /** * The type of annotation in which the aliased {@link #attribute} is declared. diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java index b42818a03d..74fac9d436 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java @@ -1427,7 +1427,7 @@ public abstract class AnnotationUtils { * @see #getAliasedAttributeName(Method, Class) */ static String getAliasedAttributeName(Method attribute) { - return getAliasedAttributeName(attribute, null); + return getAliasedAttributeName(attribute, (Class) null); } /** @@ -1471,7 +1471,7 @@ public abstract class AnnotationUtils { } String attributeName = attribute.getName(); - String aliasedAttributeName = aliasFor.attribute(); + String aliasedAttributeName = getAliasedAttributeName(aliasFor, attribute); if (!StringUtils.hasText(aliasedAttributeName)) { String msg = String.format( @@ -1503,7 +1503,7 @@ public abstract class AnnotationUtils { throw new AnnotationConfigurationException(msg); } - String mirrorAliasedAttributeName = mirrorAliasFor.attribute(); + String mirrorAliasedAttributeName = getAliasedAttributeName(mirrorAliasFor, aliasedAttribute); if (!attributeName.equals(mirrorAliasedAttributeName)) { String msg = String.format( "Attribute [%s] in annotation [%s] must be declared as an @AliasFor [%s], not [%s].", @@ -1543,6 +1543,38 @@ public abstract class AnnotationUtils { return aliasedAttributeName; } + /** + * Get the name of the aliased attribute configured via the supplied + * {@link AliasFor @AliasFor} annotation on the supplied {@code attribute}. + *

This method returns the value of either the {@code attribute} + * or {@code value} attribute of {@code @AliasFor}, ensuring that only + * one of the attributes has been declared. + * @param aliasFor the {@code @AliasFor} annotation from which to retrieve + * the aliased attribute name + * @param attribute the attribute that is annotated with {@code @AliasFor}, + * used solely for building an exception message + * @return the name of the aliased attribute, potentially an empty string + * @throws AnnotationConfigurationException if invalid configuration of + * {@code @AliasFor} is detected + * @since 4.2 + * @see #getAliasedAttributeName(Method, Class) + */ + private static String getAliasedAttributeName(AliasFor aliasFor, Method attribute) { + String attributeName = aliasFor.attribute(); + String value = aliasFor.value(); + boolean attributeDeclared = StringUtils.hasText(attributeName); + boolean valueDeclared = StringUtils.hasText(value); + + if (attributeDeclared && valueDeclared) { + throw new AnnotationConfigurationException(String.format( + "In @AliasFor declared on attribute [%s] in annotation [%s], attribute 'attribute' and its alias 'value' " + + "are present with values of [%s] and [%s], but only one is permitted.", + attribute.getName(), attribute.getDeclaringClass().getName(), attributeName, value)); + } + + return (attributeDeclared ? attributeName : value); + } + /** * Get all methods declared in the supplied {@code annotationType} that * match Java's requirements for annotation attributes. diff --git a/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java b/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java index 834a1a18f4..6a3b3a024e 100644 --- a/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java +++ b/spring-core/src/test/java/org/springframework/core/annotation/AnnotationUtilsTests.java @@ -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"; } diff --git a/spring-core/src/test/java/org/springframework/core/annotation/subpackage/NonPublicAliasedAnnotation.java b/spring-core/src/test/java/org/springframework/core/annotation/subpackage/NonPublicAliasedAnnotation.java index c5f6ef5e0a..303a116674 100644 --- a/spring-core/src/test/java/org/springframework/core/annotation/subpackage/NonPublicAliasedAnnotation.java +++ b/spring-core/src/test/java/org/springframework/core/annotation/subpackage/NonPublicAliasedAnnotation.java @@ -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 ""; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Header.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Header.java index d210a9ebaf..b1150293f1 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Header.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Header.java @@ -39,14 +39,14 @@ public @interface Header { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** * The name of the request header to bind to. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Payload.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Payload.java index b755c19a50..167784b55f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Payload.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/Payload.java @@ -43,7 +43,7 @@ public @interface Payload { /** * Alias for {@link #expression}. */ - @AliasFor(attribute = "expression") + @AliasFor("expression") String value() default ""; /** @@ -54,7 +54,7 @@ public @interface Payload { *

When processing STOMP over WebSocket messages this attribute is not supported. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String expression() default ""; /** diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SendToUser.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SendToUser.java index a85bc67b9f..fe4abb9e9d 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SendToUser.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SendToUser.java @@ -46,7 +46,7 @@ public @interface SendToUser { * Alias for {@link #destinations}. * @see #destinations */ - @AliasFor(attribute = "destinations") + @AliasFor("destinations") String[] value() default {}; /** @@ -57,7 +57,7 @@ public @interface SendToUser { * @see #value * @see org.springframework.messaging.simp.annotation.support.SendToMethodReturnValueHandler */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] destinations() default {}; /** diff --git a/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java b/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java index 8511bb9da8..a90b93a071 100644 --- a/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java +++ b/spring-test/src/main/java/org/springframework/test/context/ActiveProfiles.java @@ -55,7 +55,7 @@ public @interface ActiveProfiles { *

This attribute may not be used in conjunction with * {@link #profiles}, but it may be used instead of {@link #profiles}. */ - @AliasFor(attribute = "profiles") + @AliasFor("profiles") String[] value() default {}; /** @@ -64,7 +64,7 @@ public @interface ActiveProfiles { *

This attribute may not be used in conjunction with * {@link #value}, but it may be used instead of {@link #value}. */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] profiles() default {}; /** diff --git a/spring-test/src/main/java/org/springframework/test/context/ContextConfiguration.java b/spring-test/src/main/java/org/springframework/test/context/ContextConfiguration.java index b9e15f749c..f50c0e2a93 100644 --- a/spring-test/src/main/java/org/springframework/test/context/ContextConfiguration.java +++ b/spring-test/src/main/java/org/springframework/test/context/ContextConfiguration.java @@ -98,7 +98,7 @@ public @interface ContextConfiguration { * @since 3.0 * @see #inheritLocations */ - @AliasFor(attribute = "locations") + @AliasFor("locations") String[] value() default {}; /** @@ -129,7 +129,7 @@ public @interface ContextConfiguration { * @since 2.5 * @see #inheritLocations */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] locations() default {}; /** diff --git a/spring-test/src/main/java/org/springframework/test/context/TestExecutionListeners.java b/spring-test/src/main/java/org/springframework/test/context/TestExecutionListeners.java index 3f67b6d1d9..478fcbc33c 100644 --- a/spring-test/src/main/java/org/springframework/test/context/TestExecutionListeners.java +++ b/spring-test/src/main/java/org/springframework/test/context/TestExecutionListeners.java @@ -87,7 +87,7 @@ public @interface TestExecutionListeners { *

This attribute may not be used in conjunction with * {@link #listeners}, but it may be used instead of {@link #listeners}. */ - @AliasFor(attribute = "listeners") + @AliasFor("listeners") Class[] value() default {}; /** @@ -103,7 +103,7 @@ public @interface TestExecutionListeners { * @see org.springframework.test.context.transaction.TransactionalTestExecutionListener * @see org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener */ - @AliasFor(attribute = "value") + @AliasFor("value") Class[] listeners() default {}; /** diff --git a/spring-test/src/main/java/org/springframework/test/context/TestPropertySource.java b/spring-test/src/main/java/org/springframework/test/context/TestPropertySource.java index fad1dc65de..3f48102924 100644 --- a/spring-test/src/main/java/org/springframework/test/context/TestPropertySource.java +++ b/spring-test/src/main/java/org/springframework/test/context/TestPropertySource.java @@ -96,7 +96,7 @@ public @interface TestPropertySource { * * @see #locations */ - @AliasFor(attribute = "locations") + @AliasFor("locations") String[] value() default {}; /** @@ -144,7 +144,7 @@ public @interface TestPropertySource { * @see #properties * @see org.springframework.core.env.PropertySource */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] locations() default {}; /** diff --git a/spring-test/src/main/java/org/springframework/test/context/jdbc/Sql.java b/spring-test/src/main/java/org/springframework/test/context/jdbc/Sql.java index c2fdc3e7a0..b565912716 100644 --- a/spring-test/src/main/java/org/springframework/test/context/jdbc/Sql.java +++ b/spring-test/src/main/java/org/springframework/test/context/jdbc/Sql.java @@ -98,7 +98,7 @@ public @interface Sql { * @see #scripts * @see #statements */ - @AliasFor(attribute = "scripts") + @AliasFor("scripts") String[] value() default {}; /** @@ -139,7 +139,7 @@ public @interface Sql { * @see #value * @see #statements */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] scripts() default {}; /** diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java index 82f57607a2..3b26813b25 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java @@ -60,7 +60,7 @@ public @interface Transactional { * Alias for {@link #transactionManager}. * @see #transactionManager */ - @AliasFor(attribute = "transactionManager") + @AliasFor("transactionManager") String value() default ""; /** @@ -72,7 +72,7 @@ public @interface Transactional { * @since 4.2 * @see #value */ - @AliasFor(attribute = "value") + @AliasFor("value") String transactionManager() default ""; /** diff --git a/spring-tx/src/main/java/org/springframework/transaction/event/TransactionalEventListener.java b/spring-tx/src/main/java/org/springframework/transaction/event/TransactionalEventListener.java index 836b56ffb7..36a75716d2 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/event/TransactionalEventListener.java +++ b/spring-tx/src/main/java/org/springframework/transaction/event/TransactionalEventListener.java @@ -59,7 +59,7 @@ public @interface TransactionalEventListener { /** * Alias for {@link #classes}. */ - @AliasFor(attribute = "classes") + @AliasFor("classes") Class[] value() default {}; /** @@ -68,7 +68,7 @@ public @interface TransactionalEventListener { * may or may not be specified. When this attribute is specified with more * than one value, the method must not have a parameter. */ - @AliasFor(attribute = "value") + @AliasFor("value") Class[] classes() default {}; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/ControllerAdvice.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/ControllerAdvice.java index 1f5e65432d..07ad0ac6df 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/ControllerAdvice.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/ControllerAdvice.java @@ -68,7 +68,7 @@ public @interface ControllerAdvice { * @since 4.0 * @see #basePackages() */ - @AliasFor(attribute = "basePackages") + @AliasFor("basePackages") String[] value() default {}; /** @@ -82,7 +82,7 @@ public @interface ControllerAdvice { * alternative to String-based package names. * @since 4.0 */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] basePackages() default {}; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/CookieValue.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/CookieValue.java index d1781ec964..41aafefa42 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/CookieValue.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/CookieValue.java @@ -51,14 +51,14 @@ public @interface CookieValue { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** * The name of the cookie to bind to. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/CrossOrigin.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/CrossOrigin.java index c9e0c465c9..65e9200788 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/CrossOrigin.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/CrossOrigin.java @@ -51,7 +51,7 @@ public @interface CrossOrigin { /** * Alias for {@link #origins}. */ - @AliasFor(attribute = "origins") + @AliasFor("origins") String[] value() default {}; /** @@ -62,7 +62,7 @@ public @interface CrossOrigin { *

If undefined, all origins are allowed. * @see #value */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] origins() default {}; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/MatrixVariable.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/MatrixVariable.java index 2cfc22a91d..d531c40fcb 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/MatrixVariable.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/MatrixVariable.java @@ -50,7 +50,7 @@ public @interface MatrixVariable { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** @@ -58,7 +58,7 @@ public @interface MatrixVariable { * @since 4.2 * @see #value */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestHeader.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestHeader.java index 08a910488d..b7203f2fe2 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestHeader.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestHeader.java @@ -51,14 +51,14 @@ public @interface RequestHeader { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** * The name of the request header to bind to. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java index 5431eee6e6..854bf77e19 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestMapping.java @@ -309,7 +309,7 @@ public @interface RequestMapping { * When used at the type level, all method-level mappings inherit * this primary mapping, narrowing it for a specific handler method. */ - @AliasFor(attribute = "path") + @AliasFor("path") String[] value() default {}; /** @@ -324,7 +324,7 @@ public @interface RequestMapping { * @see org.springframework.web.bind.annotation.ValueConstants#DEFAULT_NONE * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] path() default {}; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestParam.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestParam.java index 8b1d26f661..9c5e2a03d1 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestParam.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestParam.java @@ -59,14 +59,14 @@ public @interface RequestParam { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** * The name of the request parameter to bind to. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestPart.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestPart.java index 39319aa452..b8bd5c28fa 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestPart.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/RequestPart.java @@ -67,14 +67,14 @@ public @interface RequestPart { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** * The name of the part in the {@code "multipart/form-data"} request to bind to. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java index 80f75893bf..1983f5124f 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/ResponseStatus.java @@ -45,7 +45,7 @@ public @interface ResponseStatus { /** * Alias for {@link #code}. */ - @AliasFor(attribute = "code") + @AliasFor("code") HttpStatus value() default HttpStatus.INTERNAL_SERVER_ERROR; /** @@ -55,7 +55,7 @@ public @interface ResponseStatus { * @since 4.2 * @see javax.servlet.http.HttpServletResponse#setStatus(int) */ - @AliasFor(attribute = "value") + @AliasFor("value") HttpStatus code() default HttpStatus.INTERNAL_SERVER_ERROR; /** diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/SessionAttributes.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/SessionAttributes.java index 4e45978ecc..fdfb9273be 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/SessionAttributes.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/SessionAttributes.java @@ -64,7 +64,7 @@ public @interface SessionAttributes { /** * Alias for {@link #names}. */ - @AliasFor(attribute = "names") + @AliasFor("names") String[] value() default {}; /** @@ -76,7 +76,7 @@ public @interface SessionAttributes { * names but rather operate on the model only. * @since 4.2 */ - @AliasFor(attribute = "value") + @AliasFor("value") String[] names() default {}; /** diff --git a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/ActionMapping.java b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/ActionMapping.java index 7754c49a5d..9341d3390f 100644 --- a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/ActionMapping.java +++ b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/ActionMapping.java @@ -42,7 +42,7 @@ public @interface ActionMapping { /** * Alias for {@link #name}. */ - @AliasFor(attribute = "name") + @AliasFor("name") String value() default ""; /** @@ -57,7 +57,7 @@ public @interface ActionMapping { * @see javax.portlet.ActionRequest#ACTION_NAME * @see #value */ - @AliasFor(attribute = "value") + @AliasFor("value") String name() default ""; /** diff --git a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/RenderMapping.java b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/RenderMapping.java index f11cb2d146..668d31e17e 100644 --- a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/RenderMapping.java +++ b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/bind/annotation/RenderMapping.java @@ -42,7 +42,7 @@ public @interface RenderMapping { /** * Alias for {@link #windowState}. */ - @AliasFor(attribute = "windowState") + @AliasFor("windowState") String value() default ""; /** @@ -56,7 +56,7 @@ public @interface RenderMapping { * @see #value * @see javax.portlet.PortletRequest#getWindowState() */ - @AliasFor(attribute = "value") + @AliasFor("value") String windowState() default ""; /** diff --git a/src/asciidoc/whats-new.adoc b/src/asciidoc/whats-new.adoc index 5e37ce26ba..6761f1c548 100644 --- a/src/asciidoc/whats-new.adoc +++ b/src/asciidoc/whats-new.adoc @@ -429,10 +429,10 @@ method has been added. ---- public @interface ContextConfiguration { - @AliasFor(attribute = "locations") + @AliasFor("locations") String[] value() default {}; - @AliasFor(attribute = "value") + @AliasFor("value") String[] locations() default {}; // ...