|
21 | 21 | import java.util.List;
|
22 | 22 | import java.util.Map;
|
23 | 23 | import java.util.Objects;
|
| 24 | +import java.util.Optional; |
24 | 25 | import java.util.Set;
|
25 | 26 | import java.util.stream.Collectors;
|
26 | 27 | import java.util.stream.IntStream;
|
|
32 | 33 | import org.junit.jupiter.api.Test;
|
33 | 34 |
|
34 | 35 | import org.springframework.core.ResolvableType;
|
| 36 | +import org.springframework.format.support.DefaultFormattingConversionService; |
35 | 37 | import org.springframework.graphql.Book;
|
36 | 38 | import org.springframework.validation.BindException;
|
37 | 39 | import org.springframework.validation.FieldError;
|
@@ -182,6 +184,26 @@ void primaryConstructorWithBeanArgument() throws Exception {
|
182 | 184 | assertThat(((PrimaryConstructorItemBean) result).getAge()).isEqualTo(30);
|
183 | 185 | }
|
184 | 186 |
|
| 187 | + @Test |
| 188 | + void primaryConstructorWithOptionalBeanArgument() throws Exception { |
| 189 | + |
| 190 | + GraphQlArgumentBinder argumentBinder = |
| 191 | + new GraphQlArgumentBinder(new DefaultFormattingConversionService()); |
| 192 | + |
| 193 | + Object result = argumentBinder.bind( |
| 194 | + environment( |
| 195 | + "{\"key\":{" + |
| 196 | + "\"item\":{\"name\":\"Item name\"}," + |
| 197 | + "\"name\":\"Hello\"," + |
| 198 | + "\"age\":\"30\"}}"), |
| 199 | + "key", |
| 200 | + ResolvableType.forClass(PrimaryConstructorOptionalItemBean.class)); |
| 201 | + |
| 202 | + assertThat(result).isNotNull().isInstanceOf(PrimaryConstructorOptionalItemBean.class); |
| 203 | + assertThat(((PrimaryConstructorOptionalItemBean) result).getItem().get().getName()).isEqualTo("Item name"); |
| 204 | + assertThat(((PrimaryConstructorOptionalItemBean) result).getName().get()).isEqualTo("Hello"); |
| 205 | + } |
| 206 | + |
185 | 207 | @Test
|
186 | 208 | void primaryConstructorWithNestedBeanList() throws Exception {
|
187 | 209 |
|
@@ -390,6 +412,28 @@ public List<Item> getItems() {
|
390 | 412 | }
|
391 | 413 |
|
392 | 414 |
|
| 415 | + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") |
| 416 | + static class PrimaryConstructorOptionalItemBean { |
| 417 | + |
| 418 | + private final Optional<String> name; |
| 419 | + |
| 420 | + private final Optional<Item> item; |
| 421 | + |
| 422 | + public PrimaryConstructorOptionalItemBean(Optional<String> name, Optional<Item> item) { |
| 423 | + this.name = name; |
| 424 | + this.item = item; |
| 425 | + } |
| 426 | + |
| 427 | + public Optional<String> getName() { |
| 428 | + return this.name; |
| 429 | + } |
| 430 | + |
| 431 | + public Optional<Item> getItem() { |
| 432 | + return item; |
| 433 | + } |
| 434 | + } |
| 435 | + |
| 436 | + |
393 | 437 | static class NoPrimaryConstructorBean {
|
394 | 438 |
|
395 | 439 | NoPrimaryConstructorBean(String name) {
|
|
0 commit comments