Support meta @Component with non-string value
Update AnnotationBeanNameGenerator to only use the value attribute of a @Component meta-annotated annotation when it is a String. Issue: SPR-10580
This commit is contained in:
		
							parent
							
								
									2655657a51
								
							
						
					
					
						commit
						4ba43b4737
					
				| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2002-2012 the original author or authors.
 | 
			
		||||
 * 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +116,10 @@ public class AnnotationBeanNameGenerator implements BeanNameGenerator {
 | 
			
		|||
				(metaAnnotationTypes != null && metaAnnotationTypes.contains(COMPONENT_ANNOTATION_CLASSNAME)) ||
 | 
			
		||||
				annotationType.equals("javax.annotation.ManagedBean") ||
 | 
			
		||||
				annotationType.equals("javax.inject.Named");
 | 
			
		||||
		return (isStereotype && attributes != null && attributes.containsKey("value"));
 | 
			
		||||
 | 
			
		||||
		return (isStereotype && attributes != null &&
 | 
			
		||||
				attributes.containsKey("value") &&
 | 
			
		||||
				attributes.get("value") instanceof String);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2002-2012 the original author or authors.
 | 
			
		||||
 * 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -16,16 +16,21 @@
 | 
			
		|||
 | 
			
		||||
package org.springframework.context.annotation;
 | 
			
		||||
 | 
			
		||||
import example.scannable.DefaultNamedComponent;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
 | 
			
		||||
import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition;
 | 
			
		||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 | 
			
		||||
import org.springframework.beans.factory.support.SimpleBeanDefinitionRegistry;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
import example.scannable.DefaultNamedComponent;
 | 
			
		||||
import static org.junit.Assert.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -81,6 +86,22 @@ public class AnnotationBeanNameGeneratorTests {
 | 
			
		|||
		assertEquals(expectedGeneratedBeanName, beanName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testGenerateBeanNameFromMetaComponentWithStringValue() {
 | 
			
		||||
		BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
 | 
			
		||||
		AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(ComponentFromStringMeta.class);
 | 
			
		||||
		String beanName = this.beanNameGenerator.generateBeanName(bd, registry);
 | 
			
		||||
		assertEquals("henry", beanName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testGenerateBeanNameFromMetaComponentWithNonStringValue() {
 | 
			
		||||
		BeanDefinitionRegistry registry = new SimpleBeanDefinitionRegistry();
 | 
			
		||||
		AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(ComponentFromNonStringMeta.class);
 | 
			
		||||
		String beanName = this.beanNameGenerator.generateBeanName(bd, registry);
 | 
			
		||||
		assertEquals("annotationBeanNameGeneratorTests.ComponentFromNonStringMeta", beanName);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	@Component("walden")
 | 
			
		||||
	private static class ComponentWithName {
 | 
			
		||||
| 
						 | 
				
			
			@ -96,4 +117,19 @@ public class AnnotationBeanNameGeneratorTests {
 | 
			
		|||
	private static class AnonymousComponent {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Service("henry")
 | 
			
		||||
	private static class ComponentFromStringMeta {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
	@Target(ElementType.TYPE)
 | 
			
		||||
	@Component
 | 
			
		||||
	public @interface NonStringMetaComponent {
 | 
			
		||||
		long value();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@NonStringMetaComponent(123)
 | 
			
		||||
	private static class ComponentFromNonStringMeta {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue