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 4a8e030dc10..520ddd62140 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 c199439d031..deac117aa81 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 973c3eaa14c..9e7697e9bc6 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 a147cd1bf06..a1052fd6dc6 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 97005bbb7d6..2cc78ddc5fa 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 98488e8610a..b0daf8c0cec 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 45dd91ebb52..b393b66f4c8 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 0dd1fb7ad70..555a65d48f3 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 9832f094b8e..8a9a9717488 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 b42818a03d1..74fac9d4366 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 834a1a18f43..6a3b3a024e0 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 c5f6ef5e0a7..303a1166743 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 d210a9ebafe..b1150293f10 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 b755c19a509..167784b55ff 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 a85bc67b9fb..fe4abb9e9dc 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 8511bb9da84..a90b93a071a 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 b9e15f749c2..f50c0e2a93c 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 3f67b6d1d94..478fcbc33cc 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 fad1dc65de1..3f481029248 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 c2fdc3e7a00..b5659127162 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 82f57607a23..3b26813b253 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 836b56ffb7e..36a75716d2e 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 1f5e65432d0..07ad0ac6df9 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 d1781ec964e..41aafefa42e 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 c9e0c465c9d..65e9200788e 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 2cfc22a91d2..d531c40fcb8 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 08a910488db..b7203f2fe2d 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 5431eee6e62..854bf77e19b 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 8b1d26f661e..9c5e2a03d17 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 39319aa452a..b8bd5c28fa0 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 80f75893bf1..1983f5124fa 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 4e45978eccb..fdfb9273be2 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 7754c49a5d2..9341d3390fa 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 f11cb2d1461..668d31e17ed 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 5e37ce26ba2..6761f1c548a 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 {}; // ...