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 fce8db6e7d..4e45978ecc 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,11 +23,14 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.springframework.core.annotation.AliasFor; + /** - * Annotation that indicates the session attributes that a specific handler - * uses. This will typically list the names of model attributes which should be + * Annotation that indicates the session attributes that a specific handler uses. + * + *

This will typically list the names of model attributes which should be * transparently stored in the session or some conversational storage, - * serving as form-backing beans. Declared at the type level, applying + * serving as form-backing beans. Declared at the type level, applying * to the model attributes that the annotated handler class operates on. * *

NOTE: Session attributes as indicated using this annotation @@ -44,11 +47,12 @@ import java.lang.annotation.Target; * generic {@link org.springframework.web.context.request.WebRequest} interface. * *

NOTE: When using controller interfaces (e.g. for AOP proxying), - * make sure to consistently put all your mapping annotations - such as - * {@code @RequestMapping} and {@code @SessionAttributes} - on + * make sure to consistently put all your mapping annotations — + * such as {@code @RequestMapping} and {@code @SessionAttributes} — on * the controller interface rather than on the implementation class. * * @author Juergen Hoeller + * @author Sam Brannen * @since 2.5 */ @Target({ElementType.TYPE}) @@ -58,18 +62,28 @@ import java.lang.annotation.Target; public @interface SessionAttributes { /** - * The names of session attributes in the model, to be stored in the - * session or some conversational storage. - *

Note: This indicates the model attribute names. The session attribute - * names may or may not match the model attribute names; applications should - * not rely on the session attribute names but rather operate on the model only. + * Alias for {@link #names}. */ + @AliasFor(attribute = "names") String[] value() default {}; /** - * The types of session attributes in the model, to be stored in the - * session or some conversational storage. All model attributes of this - * type will be stored in the session, regardless of attribute name. + * The names of session attributes in the model that should be stored in the + * session or some conversational storage. + *

Note: This indicates the model attribute names. + * The session attribute names may or may not match the model attribute + * names. Applications should therefore not rely on the session attribute + * names but rather operate on the model only. + * @since 4.2 + */ + @AliasFor(attribute = "value") + String[] names() default {}; + + /** + * The types of session attributes in the model that should be stored in the + * session or some conversational storage. + *

All model attributes of these types will be stored in the session, + * regardless of attribute name. */ Class[] types() default {}; diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodResolver.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodResolver.java index 1848a0001c..9fd25c014f 100644 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodResolver.java +++ b/spring-web/src/main/java/org/springframework/web/bind/annotation/support/HandlerMethodResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -107,7 +107,7 @@ public class HandlerMethodResolver { SessionAttributes sessionAttributes = AnnotationUtils.findAnnotation(handlerType, SessionAttributes.class); this.sessionAttributesFound = (sessionAttributes != null); if (this.sessionAttributesFound) { - this.sessionAttributeNames.addAll(Arrays.asList(sessionAttributes.value())); + this.sessionAttributeNames.addAll(Arrays.asList(sessionAttributes.names())); this.sessionAttributeTypes.addAll(Arrays.asList(sessionAttributes.types())); } } diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java b/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java index 2430c66d32..3ff2b31540 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/SessionAttributesHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -70,8 +70,8 @@ public class SessionAttributesHandler { SessionAttributes annotation = AnnotationUtils.findAnnotation(handlerType, SessionAttributes.class); if (annotation != null) { - this.attributeNames.addAll(Arrays.asList(annotation.value())); - this.attributeTypes.addAll(Arrays.>asList(annotation.types())); + this.attributeNames.addAll(Arrays.asList(annotation.names())); + this.attributeTypes.addAll(Arrays.asList(annotation.types())); } for (String attributeName : this.attributeNames) { diff --git a/spring-web/src/test/java/org/springframework/web/method/annotation/SessionAttributesHandlerTests.java b/spring-web/src/test/java/org/springframework/web/method/annotation/SessionAttributesHandlerTests.java index 85f2a7527b..51d791eb80 100644 --- a/spring-web/src/test/java/org/springframework/web/method/annotation/SessionAttributesHandlerTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/annotation/SessionAttributesHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,9 @@ package org.springframework.web.method.annotation; + import java.util.HashSet; -import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.test.MockHttpServletRequest; @@ -40,20 +40,13 @@ import static org.junit.Assert.*; */ public class SessionAttributesHandlerTests { - private Class handlerType = SessionAttributeHandler.class; - - private SessionAttributesHandler sessionAttributesHandler; + private final SessionAttributeStore sessionAttributeStore = new DefaultSessionAttributeStore(); - private SessionAttributeStore sessionAttributeStore; + private final SessionAttributesHandler sessionAttributesHandler = new SessionAttributesHandler( + SessionAttributeHandler.class, sessionAttributeStore); - private NativeWebRequest request; + private final NativeWebRequest request = new ServletWebRequest(new MockHttpServletRequest()); - @Before - public void setUp() { - this.sessionAttributeStore = new DefaultSessionAttributeStore(); - this.sessionAttributesHandler = new SessionAttributesHandler(handlerType, sessionAttributeStore); - this.request = new ServletWebRequest(new MockHttpServletRequest()); - } @Test public void isSessionAttribute() throws Exception { @@ -115,7 +108,8 @@ public class SessionAttributesHandlerTests { assertTrue(sessionAttributeStore.retrieveAttribute(request, "attr3") instanceof TestBean); } - @SessionAttributes(value = { "attr1", "attr2" }, types = { TestBean.class }) + + @SessionAttributes(names = { "attr1", "attr2" }, types = { TestBean.class }) private static class SessionAttributeHandler { } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java index 6cdc290cc1..8c50836c75 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/annotation/ServletAnnotationControllerTests.java @@ -2163,7 +2163,7 @@ public class ServletAnnotationControllerTests { @Controller @RequestMapping("/myPage") - @SessionAttributes({"object1", "object2"}) + @SessionAttributes(names = { "object1", "object2" }) public static class MySessionAttributesController { @RequestMapping(method = RequestMethod.GET) diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java index cf6bffab9f..efecd12ec9 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ServletAnnotationControllerHandlerMethodTests.java @@ -1774,7 +1774,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl @Controller @RequestMapping("/myPage") - @SessionAttributes({"object1", "object2"}) + @SessionAttributes(names = { "object1", "object2" }) public static class MySessionAttributesController { @RequestMapping(method = RequestMethod.GET)