From 11330baf776e13fc914ab58564e3f50bf41556a8 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 10 Jun 2010 21:45:47 +0000 Subject: [PATCH] DefaultListableBeanFactory checks for alias circle on registerAlias (avoiding endless loop; SPR-7274) --- .../DefaultListableBeanFactoryTests.java | 14 ++++++++++++++ .../core/SimpleAliasRegistry.java | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java b/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java index 3697c6921db..bcac78bdca5 100644 --- a/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java +++ b/org.springframework.beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java @@ -723,6 +723,20 @@ public class DefaultListableBeanFactoryTests { assertTrue("Test bean age is 48", tb.getAge() == 48); } + @Test + public void testAliasCircle() { + DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); + lbf.registerAlias("test", "test2"); + lbf.registerAlias("test2", "test3"); + try { + lbf.registerAlias("test3", "test"); + fail("Should have thrown IllegalStateException"); + } + catch (IllegalStateException ex) { + // expected + } + } + @Test public void testBeanDefinitionOverriding() { DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); diff --git a/org.springframework.core/src/main/java/org/springframework/core/SimpleAliasRegistry.java b/org.springframework.core/src/main/java/org/springframework/core/SimpleAliasRegistry.java index 55664481574..971906fc781 100644 --- a/org.springframework.core/src/main/java/org/springframework/core/SimpleAliasRegistry.java +++ b/org.springframework.core/src/main/java/org/springframework/core/SimpleAliasRegistry.java @@ -55,6 +55,7 @@ public class SimpleAliasRegistry implements AliasRegistry { name + "': It is already registered for name '" + registeredName + "'."); } } + checkForAliasCircle(name, alias); this.aliasMap.put(alias, name); } } @@ -128,6 +129,7 @@ public class SimpleAliasRegistry implements AliasRegistry { "') for name '" + resolvedName + "': It is already registered for name '" + registeredName + "'."); } + checkForAliasCircle(resolvedName, resolvedAlias); this.aliasMap.remove(alias); this.aliasMap.put(resolvedAlias, resolvedName); } @@ -157,4 +159,20 @@ public class SimpleAliasRegistry implements AliasRegistry { return canonicalName; } + /** + * Check whether the given name points back to given alias as an alias + * in the other direction, catching a circular reference upfront and + * throwing a corresponding IllegalStateException. + * @param name the candidate name + * @param alias the candidate alias + * @see #registerAlias + */ + protected void checkForAliasCircle(String name, String alias) { + if (alias.equals(canonicalName(name))) { + throw new IllegalStateException("Cannot register alias '" + alias + + "' for name '" + name + "': Circular reference - '" + + name + "' is a direct or indirect alias for '" + alias + "' already"); + } + } + }