From a032e863554caf74302867b51b062bf5d15e5c97 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 18 Jul 2017 00:54:49 +0200 Subject: [PATCH] Explicit error message for bean name clash with containing configuration class Issue: SPR-15775 (cherry picked from commit bca5a36) --- ...onfigurationClassBeanDefinitionReader.java | 5 ++++ .../ConfigurationClassPostProcessorTests.java | 6 ++++ .../context/annotation/MyTestBean.java | 30 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 spring-context/src/test/java/org/springframework/context/annotation/MyTestBean.java diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java index 5afc4a26072..fb3e508d926 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassBeanDefinitionReader.java @@ -195,6 +195,11 @@ class ConfigurationClassBeanDefinitionReader { // Has this effectively been overridden before (e.g. via XML)? if (isOverriddenByExistingDefinition(beanMethod, beanName)) { + if (beanName.equals(beanMethod.getConfigurationClass().getBeanName())) { + throw new BeanDefinitionStoreException(beanMethod.getConfigurationClass().getResource().getDescription(), + beanName, "Bean name derived from @Bean method '" + beanMethod.getMetadata().getMethodName() + + "' clashes with bean name for containing configuration class; please make those names unique!"); + } return; } diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java index b5d75c8fb07..def4d133ac4 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java @@ -788,6 +788,12 @@ public class ConfigurationClassPostProcessorTests { assertSame(ctx.getBean(TestBean.class), bean.getTestBean()); } + @Test(expected = BeanDefinitionStoreException.class) + public void testNameClashBetweenConfigurationClassAndBean() { + ApplicationContext ctx = new AnnotationConfigApplicationContext(MyTestBean.class); + ctx.getBean("myTestBean", TestBean.class); + } + // ------------------------------------------------------------------------- diff --git a/spring-context/src/test/java/org/springframework/context/annotation/MyTestBean.java b/spring-context/src/test/java/org/springframework/context/annotation/MyTestBean.java new file mode 100644 index 00000000000..63bef7533cb --- /dev/null +++ b/spring-context/src/test/java/org/springframework/context/annotation/MyTestBean.java @@ -0,0 +1,30 @@ +/* + * Copyright 2002-2017 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 org.springframework.context.annotation; + +/** + * @author Juergen Hoeller + */ +@Configuration +class MyTestBean { + + @Bean + public org.springframework.tests.sample.beans.TestBean myTestBean() { + return new org.springframework.tests.sample.beans.TestBean(); + } + +}