Browse Source

GRAILS-4995 - Improve the handling of List and Map ctor args

pull/125/head
Jeff Brown 12 years ago
parent
commit
fbcdc573c2
  1. 7
      spring-lang-groovy/src/main/java/org/springframework/context/groovy/GroovyBeanDefinitionReader.java
  2. 44
      spring-lang-groovy/src/test/groovy/org/springframework/context/groovy/GroovyBeanDefinitionReaderTests.groovy

7
spring-lang-groovy/src/main/java/org/springframework/context/groovy/GroovyBeanDefinitionReader.java

@ -714,6 +714,13 @@ public class GroovyBeanDefinitionReader extends GroovyObjectSupport { @@ -714,6 +714,13 @@ public class GroovyBeanDefinitionReader extends GroovyObjectSupport {
protected List resolveConstructorArguments(Object[] args, int start, int end) {
Object[] constructorArgs = subarray(args, start, end);
filterGStringReferences(constructorArgs);
for(int i = 0; i < constructorArgs.length; i++) {
if(constructorArgs[i] instanceof List) {
constructorArgs[i] = manageListIfNecessary(constructorArgs[i]);
} else if(constructorArgs[i] instanceof Map){
constructorArgs[i] = manageMapIfNecessary(constructorArgs[i]);
}
}
List constructorArgsList = Arrays.asList(constructorArgs);
return constructorArgsList;
}

44
spring-lang-groovy/src/test/groovy/org/springframework/context/groovy/GroovyBeanDefinitionReaderTests.groovy

@ -772,9 +772,7 @@ beanReader.createApplicationContext() @@ -772,9 +772,7 @@ beanReader.createApplicationContext()
assertEquals "Fred", appCtx.getBean("personA").name
}
// test for GRAILS-4995
void testListOfBeansAsConstructorArg() {
if(notYetImplemented()) return
def beanReader = new GroovyBeanDefinitionReader()
beanReader.beans {
@ -790,6 +788,34 @@ beanReader.createApplicationContext() @@ -790,6 +788,34 @@ beanReader.createApplicationContext()
assert ctx.containsBean('someotherbean2')
assert ctx.containsBean('somebean')
}
void testBeanWithListAndMapConstructor() {
def beanReader = new GroovyBeanDefinitionReader()
beanReader.beans {
bart(Bean1) {
person = "bart"
age = 11
}
lisa(Bean1) {
person = "lisa"
age = 9
}
beanWithList(Bean5, [bart, lisa])
// test runtime references both as ref() and as plain name
beanWithMap(Bean6, [bart:bart, lisa:ref('lisa')])
}
def ctx = beanReader.createApplicationContext()
def beanWithList = ctx.getBean("beanWithList")
assertEquals 2, beanWithList.people.size()
assertEquals "bart", beanWithList.people[0].person
def beanWithMap = ctx.getBean("beanWithMap")
assertEquals 9, beanWithMap.peopleByName.lisa.age
assertEquals "bart", beanWithMap.peopleByName.bart.person
}
void testAnonymousInnerBeanViaBeanMethod() {
def beanReader = new GroovyBeanDefinitionReader()
@ -903,6 +929,20 @@ class Bean4 { @@ -903,6 +929,20 @@ class Bean4 {
}
String person
}
// bean with List-valued constructor arg
class Bean5 {
Bean5(List<Bean1> people) {
this.people = people
}
List<Bean1> people
}
// bean with Map-valued constructor arg
class Bean6 {
Bean6(Map<String, Bean1> peopleByName) {
this.peopleByName = peopleByName
}
Map<String, Bean1> peopleByName
}
// a factory bean
class Bean1Factory {
Bean1 newInstance() {

Loading…
Cancel
Save