Skip to content

Commit bad704b

Browse files
committed
Improve liste injection
1 parent 812a176 commit bad704b

File tree

3 files changed

+46
-4
lines changed

3 files changed

+46
-4
lines changed

src/integrationTest/groovy/annotated/InjectMultipleDependenciesSpec.groovy

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@ class InjectMultipleDependenciesSpec extends Specification {
1616
bar.foo.size() == 2
1717
}
1818

19+
def "should inject list of beans with extends"() {
20+
given:
21+
Context context = Context.scanPackage(annotated.samples.multiple_deps.Bar2)
22+
when:
23+
annotated.samples.multiple_deps.Bar2 bar = context.get(annotated.samples.multiple_deps.Bar2)
24+
25+
then:
26+
bar.foo != null
27+
bar.foo.size() == 2
28+
}
29+
1930
def "should inject empty list for no beans and optional dependency"() {
2031
given:
2132
Context context = Context.scanPackage(annotated.samples.optional_multiple_deps.Bar)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package annotated.samples.multiple_deps
2+
3+
import com.coditory.quark.context.annotations.Bean
4+
5+
@Bean
6+
class Bar2 {
7+
final List<Foo> foo
8+
9+
Bar2(List<? extends Foo> foo) {
10+
this.foo = foo
11+
}
12+
}

src/main/java/com/coditory/quark/context/DependencyResolver.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.lang.reflect.Method;
88
import java.lang.reflect.ParameterizedType;
99
import java.lang.reflect.Type;
10+
import java.lang.reflect.WildcardType;
1011
import java.util.Arrays;
1112
import java.util.List;
1213

@@ -85,10 +86,28 @@ private static Object resolveDependency(ResolutionContext context, Dependency de
8586
}
8687
if (List.class == parameterType) {
8788
ParameterizedType parameterizedType = (ParameterizedType) genericType;
88-
Class<?> listItemType = (Class<?>) parameterizedType.getActualTypeArguments()[0];
89-
return required
90-
? context.getAll(listItemType)
91-
: context.getAllOrEmpty(listItemType);
89+
Type type = parameterizedType.getActualTypeArguments()[0];
90+
if (type instanceof Class<?> listItemType) {
91+
return required
92+
? context.getAll(listItemType)
93+
: context.getAllOrEmpty(listItemType);
94+
}
95+
if (type instanceof WildcardType wildcardItemType) {
96+
if (wildcardItemType.getUpperBounds() == null || wildcardItemType.getUpperBounds().length != 1) {
97+
throw new IllegalArgumentException("Invalid number of upper bound arguments");
98+
}
99+
if (wildcardItemType.getLowerBounds() != null && wildcardItemType.getLowerBounds().length != 0) {
100+
throw new IllegalArgumentException("Unexpected lower bound type in list dependency");
101+
}
102+
Type upperBound = wildcardItemType.getUpperBounds()[0];
103+
if (upperBound instanceof Class<?> lowerBoundClass) {
104+
return required
105+
? context.getAll(lowerBoundClass)
106+
: context.getAllOrEmpty(lowerBoundClass);
107+
}
108+
throw new IllegalArgumentException("Unexpected lower bound type: " + upperBound);
109+
}
110+
throw new ContextException("Invalid List generic type in dependency: " + name);
92111
}
93112
if (!name.isEmpty()) {
94113
return required

0 commit comments

Comments
 (0)