Skip to content

Commit 7cf322c

Browse files
committed
bean converter: support java.util.Collection while provisioning parameter #2069
1 parent 6556de0 commit 7cf322c

4 files changed

Lines changed: 49 additions & 7 deletions

File tree

jooby/src/main/java/io/jooby/internal/converter/ReflectiveBeanConverter.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.lang.reflect.Method;
1515
import java.lang.reflect.Modifier;
1616
import java.lang.reflect.Parameter;
17+
import java.util.Collection;
1718
import java.util.Collections;
1819
import java.util.HashSet;
1920
import java.util.List;
@@ -161,21 +162,21 @@ private static Object value(Parameter parameter, ValueNode node, ValueNode value
161162
try {
162163
if (isFileUpload(node, parameter)) {
163164
Multipart multipart = (Multipart) node;
164-
if (List.class.isAssignableFrom(parameter.getType())) {
165-
return multipart.files(value.name());
166-
} else if (Set.class.isAssignableFrom(parameter.getType())) {
165+
if (Set.class.isAssignableFrom(parameter.getType())) {
167166
return new HashSet<>(multipart.files(value.name()));
167+
} else if (Collection.class.isAssignableFrom(parameter.getType())) {
168+
return multipart.files(value.name());
168169
} else if (Optional.class.isAssignableFrom(parameter.getType())) {
169170
List<FileUpload> files = multipart.files(value.name());
170171
return files.isEmpty() ? Optional.empty() : Optional.of(files.get(0));
171172
} else {
172173
return multipart.file(value.name());
173174
}
174175
} else {
175-
if (List.class.isAssignableFrom(parameter.getType())) {
176-
return value.toList($Types.parameterizedType0(parameter.getParameterizedType()));
177-
} else if (Set.class.isAssignableFrom(parameter.getType())) {
176+
if (Set.class.isAssignableFrom(parameter.getType())) {
178177
return value.toSet($Types.parameterizedType0(parameter.getParameterizedType()));
178+
} else if (Collection.class.isAssignableFrom(parameter.getType())) {
179+
return value.toList($Types.parameterizedType0(parameter.getParameterizedType()));
179180
} else if (Optional.class.isAssignableFrom(parameter.getType())) {
180181
return value.toOptional($Types.parameterizedType0(parameter.getParameterizedType()));
181182
} else {

tests/src/test/java/io/jooby/i2068/Issue2068.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
public class Issue2068 {
99

1010
@ServerTest
11-
public void shouldFailIfContextAsServiceWasNotCalled(ServerTestRunner runner) {
11+
public void shouldFavorEmptyConstructor(ServerTestRunner runner) {
1212
runner.define(app -> {
1313
app.get("/i2068", ctx -> {
1414
Bean2068 bean = ctx.query(Bean2068.class);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.jooby.i2069;
2+
3+
import java.util.Collection;
4+
5+
public class Bean2069 {
6+
7+
private Collection<String> id;
8+
9+
public Collection<String> getId() {
10+
return id;
11+
}
12+
13+
public void setId(Collection<String> id) {
14+
this.id = id;
15+
}
16+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package io.jooby.i2069;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import io.jooby.i2068.Bean2068;
6+
import io.jooby.junit.ServerTest;
7+
import io.jooby.junit.ServerTestRunner;
8+
9+
public class Issue2069 {
10+
11+
@ServerTest
12+
public void shouldSupportCollectionAsQueryParameter(ServerTestRunner runner) {
13+
runner.define(app -> {
14+
app.get("/i2069", ctx -> {
15+
Bean2069 bean = ctx.query(Bean2069.class);
16+
return bean.getId();
17+
});
18+
}).ready(http -> {
19+
http.get("/i2069?id=foo.id", rsp -> {
20+
assertEquals("[foo.id]", rsp.body().string());
21+
});
22+
});
23+
}
24+
25+
}

0 commit comments

Comments
 (0)