From 23546b12347775c01d5195a778419134cab00140 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 17 Dec 2013 12:39:24 +0100 Subject: [PATCH] Moved AnnotationBeanNameGenerator's String value check right before cast Issue: SPR-11221 --- .../AnnotationBeanNameGenerator.java | 19 ++++----- .../scannable/CustomAspectStereotype.java | 39 +++++++++++++++++++ .../scannable/ServiceInvocationCounter.java | 4 +- 3 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 spring-context/src/test/java/example/scannable/CustomAspectStereotype.java diff --git a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java index 3dad0dd2e8..921745cda3 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/AnnotationBeanNameGenerator.java @@ -89,13 +89,16 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator { for (String type : types) { AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(amd, type); if (isStereotypeWithNameValue(type, amd.getMetaAnnotationTypes(type), attributes)) { - String value = (String) attributes.get("value"); - if (StringUtils.hasLength(value)) { - if (beanName != null && !value.equals(beanName)) { - throw new IllegalStateException("Stereotype annotations suggest inconsistent " + - "component names: '" + beanName + "' versus '" + value + "'"); + Object value = attributes.get("value"); + if (value instanceof String) { + String strVal = (String) value; + if (StringUtils.hasLength(strVal)) { + if (beanName != null && !strVal.equals(beanName)) { + throw new IllegalStateException("Stereotype annotations suggest inconsistent " + + "component names: '" + beanName + "' versus '" + strVal + "'"); + } + beanName = strVal; } - beanName = value; } } } @@ -118,9 +121,7 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator { annotationType.equals("javax.annotation.ManagedBean") || annotationType.equals("javax.inject.Named"); - return (isStereotype && attributes != null && - attributes.containsKey("value") && - attributes.get("value") instanceof String); + return (isStereotype && attributes != null && attributes.containsKey("value")); } /** diff --git a/spring-context/src/test/java/example/scannable/CustomAspectStereotype.java b/spring-context/src/test/java/example/scannable/CustomAspectStereotype.java new file mode 100644 index 0000000000..75748d7e43 --- /dev/null +++ b/spring-context/src/test/java/example/scannable/CustomAspectStereotype.java @@ -0,0 +1,39 @@ +/* + * Copyright 2002-2013 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example.scannable; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.stereotype.Component; + +/** + * @author Juergen Hoeller + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Component +public @interface CustomAspectStereotype { + + /** + * Not a plain String value - needs to be ignored during name detection. + */ + String[] value() default {}; + +} diff --git a/spring-context/src/test/java/example/scannable/ServiceInvocationCounter.java b/spring-context/src/test/java/example/scannable/ServiceInvocationCounter.java index eed10c0783..87cc405222 100644 --- a/spring-context/src/test/java/example/scannable/ServiceInvocationCounter.java +++ b/spring-context/src/test/java/example/scannable/ServiceInvocationCounter.java @@ -20,12 +20,10 @@ import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; -import org.springframework.stereotype.Component; - /** * @author Mark Fisher */ -@Component +@CustomAspectStereotype({"myPointcutInfo", "otherPointcutInfo"}) @Aspect public class ServiceInvocationCounter {