|
18 | 18 | import static org.assertj.core.api.Assertions.*; |
19 | 19 | import static org.mockito.Mockito.*; |
20 | 20 |
|
| 21 | +import io.r2dbc.spi.Parameters; |
21 | 22 | import io.r2dbc.spi.R2dbcType; |
22 | 23 | import io.r2dbc.spi.test.MockColumnMetadata; |
23 | 24 | import io.r2dbc.spi.test.MockResult; |
|
36 | 37 | import org.junit.jupiter.api.BeforeEach; |
37 | 38 | import org.junit.jupiter.api.Test; |
38 | 39 | import org.springframework.beans.factory.ObjectFactory; |
| 40 | +import org.springframework.core.convert.converter.Converter; |
39 | 41 | import org.springframework.data.annotation.CreatedDate; |
40 | 42 | import org.springframework.data.annotation.Id; |
41 | 43 | import org.springframework.data.annotation.LastModifiedDate; |
|
44 | 46 | import org.springframework.data.domain.Sort; |
45 | 47 | import org.springframework.data.mapping.callback.ReactiveEntityCallbacks; |
46 | 48 | import org.springframework.data.mapping.context.PersistentEntities; |
| 49 | +import org.springframework.data.r2dbc.convert.MappingR2dbcConverter; |
| 50 | +import org.springframework.data.r2dbc.convert.R2dbcCustomConversions; |
47 | 51 | import org.springframework.data.r2dbc.dialect.PostgresDialect; |
48 | 52 | import org.springframework.data.r2dbc.mapping.OutboundRow; |
| 53 | +import org.springframework.data.r2dbc.mapping.R2dbcMappingContext; |
49 | 54 | import org.springframework.data.r2dbc.mapping.event.AfterConvertCallback; |
50 | 55 | import org.springframework.data.r2dbc.mapping.event.AfterSaveCallback; |
51 | 56 | import org.springframework.data.r2dbc.mapping.event.BeforeConvertCallback; |
@@ -83,7 +88,11 @@ void before() { |
83 | 88 | recorder = StatementRecorder.newInstance(); |
84 | 89 | client = DatabaseClient.builder().connectionFactory(recorder) |
85 | 90 | .bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory()).build(); |
86 | | - entityTemplate = new R2dbcEntityTemplate(client, PostgresDialect.INSTANCE); |
| 91 | + |
| 92 | + R2dbcCustomConversions conversions = R2dbcCustomConversions.of(PostgresDialect.INSTANCE, new MoneyConverter()); |
| 93 | + |
| 94 | + entityTemplate = new R2dbcEntityTemplate(client, PostgresDialect.INSTANCE, |
| 95 | + new MappingR2dbcConverter(new R2dbcMappingContext(), conversions)); |
87 | 96 | } |
88 | 97 |
|
89 | 98 | @Test // gh-220 |
@@ -540,6 +549,25 @@ void updateExcludesInsertOnlyColumns() { |
540 | 549 | Parameter.from(23L)); |
541 | 550 | } |
542 | 551 |
|
| 552 | + @Test // GH-1696 |
| 553 | + void shouldConsiderParameterConverter() { |
| 554 | + |
| 555 | + MockRowMetadata metadata = MockRowMetadata.builder().build(); |
| 556 | + MockResult result = MockResult.builder().rowMetadata(metadata).rowsUpdated(1).build(); |
| 557 | + |
| 558 | + recorder.addStubbing(s -> s.startsWith("INSERT"), result); |
| 559 | + |
| 560 | + entityTemplate.insert(new WithMoney(null, new Money((byte) 1))).as(StepVerifier::create) // |
| 561 | + .expectNextCount(1) // |
| 562 | + .verifyComplete(); |
| 563 | + |
| 564 | + StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("INSERT")); |
| 565 | + |
| 566 | + assertThat(statement.getSql()).isEqualTo("INSERT INTO with_money (money) VALUES ($1)"); |
| 567 | + assertThat(statement.getBindings()).hasSize(1).containsEntry(0, |
| 568 | + Parameter.from(Parameters.in(R2dbcType.VARCHAR, "$$$"))); |
| 569 | + } |
| 570 | + |
543 | 571 | @Value |
544 | 572 | static class WithoutId { |
545 | 573 |
|
@@ -687,4 +715,19 @@ public Mono<Person> onAfterConvert(Person entity, SqlIdentifier table) { |
687 | 715 | return Mono.just(person); |
688 | 716 | } |
689 | 717 | } |
| 718 | + |
| 719 | + record WithMoney(@Id Integer id, Money money) { |
| 720 | + } |
| 721 | + |
| 722 | + record Money(byte amount) { |
| 723 | + } |
| 724 | + |
| 725 | + static class MoneyConverter implements Converter<Money, io.r2dbc.spi.Parameter> { |
| 726 | + |
| 727 | + @Override |
| 728 | + public io.r2dbc.spi.Parameter convert(Money source) { |
| 729 | + return Parameters.in(R2dbcType.VARCHAR, "$$$"); |
| 730 | + } |
| 731 | + |
| 732 | + } |
690 | 733 | } |
0 commit comments