24
24
import lombok .AllArgsConstructor ;
25
25
26
26
import java .util .ArrayList ;
27
+ import java .util .Arrays ;
27
28
import java .util .Collections ;
28
29
import java .util .List ;
30
+ import java .util .Set ;
29
31
30
32
import org .junit .jupiter .api .BeforeEach ;
31
33
import org .junit .jupiter .api .Test ;
32
34
35
+ import org .springframework .core .convert .TypeDescriptor ;
36
+ import org .springframework .core .convert .converter .ConditionalConverter ;
37
+ import org .springframework .core .convert .converter .GenericConverter ;
33
38
import org .springframework .data .annotation .Id ;
34
39
import org .springframework .data .convert .CustomConversions ;
40
+ import org .springframework .data .convert .ReadingConverter ;
41
+ import org .springframework .data .convert .WritingConverter ;
35
42
import org .springframework .data .r2dbc .dialect .PostgresDialect ;
36
43
import org .springframework .data .r2dbc .mapping .OutboundRow ;
37
44
import org .springframework .data .r2dbc .mapping .R2dbcMappingContext ;
44
51
*
45
52
* @author Mark Paluch
46
53
*/
47
- public class PostgresMappingR2dbcConverterUnitTests {
54
+ class PostgresMappingR2dbcConverterUnitTests {
48
55
49
- RelationalMappingContext mappingContext = new R2dbcMappingContext ();
50
- MappingR2dbcConverter converter = new MappingR2dbcConverter (mappingContext );
56
+ private RelationalMappingContext mappingContext = new R2dbcMappingContext ();
57
+ private MappingR2dbcConverter converter = new MappingR2dbcConverter (mappingContext );
51
58
52
59
@ BeforeEach
53
- public void before () {
60
+ void before () {
54
61
55
62
List <Object > converters = new ArrayList <>(PostgresDialect .INSTANCE .getConverters ());
56
63
converters .addAll (R2dbcCustomConversions .STORE_CONVERTERS );
57
64
CustomConversions .StoreConversions storeConversions = CustomConversions .StoreConversions
58
65
.of (PostgresDialect .INSTANCE .getSimpleTypeHolder (), converters );
59
66
60
- R2dbcCustomConversions customConversions = new R2dbcCustomConversions (storeConversions , Collections .emptyList ());
67
+ R2dbcCustomConversions customConversions = new R2dbcCustomConversions (storeConversions ,
68
+ Arrays .asList (JsonToJsonHolderConverter .INSTANCE , JsonHolderToJsonConverter .INSTANCE ));
61
69
62
70
mappingContext .setSimpleTypeHolder (customConversions .getSimpleTypeHolder ());
63
71
64
72
converter = new MappingR2dbcConverter (mappingContext , customConversions );
65
73
}
66
74
67
75
@ Test // gh-318
68
- public void shouldPassThruJson () {
76
+ void shouldPassThruJson () {
69
77
70
78
JsonPerson person = new JsonPerson (null , Json .of ("{\" hello\" :\" world\" }" ));
71
79
@@ -76,7 +84,7 @@ public void shouldPassThruJson() {
76
84
}
77
85
78
86
@ Test // gh-453
79
- public void shouldConvertJsonToString () {
87
+ void shouldConvertJsonToString () {
80
88
81
89
MockRow row = MockRow .builder ().identified ("json_string" , Object .class , Json .of ("{\" hello\" :\" world\" }" )).build ();
82
90
@@ -88,7 +96,7 @@ public void shouldConvertJsonToString() {
88
96
}
89
97
90
98
@ Test // gh-453
91
- public void shouldConvertJsonToByteArray () {
99
+ void shouldConvertJsonToByteArray () {
92
100
93
101
MockRow row = MockRow .builder ().identified ("json_bytes" , Object .class , Json .of ("{\" hello\" :\" world\" }" )).build ();
94
102
@@ -99,6 +107,32 @@ public void shouldConvertJsonToByteArray() {
99
107
assertThat (result .jsonBytes ).isEqualTo ("{\" hello\" :\" world\" }" .getBytes ());
100
108
}
101
109
110
+ @ Test // gh-585
111
+ void shouldApplyCustomReadingConverter () {
112
+
113
+ MockRow row = MockRow .builder ().identified ("holder" , Object .class , Json .of ("{\" hello\" :\" world\" }" )).build ();
114
+
115
+ MockRowMetadata metadata = MockRowMetadata .builder ()
116
+ .columnMetadata (MockColumnMetadata .builder ().name ("holder" ).build ()).build ();
117
+
118
+ WithJsonHolder result = converter .read (WithJsonHolder .class , row , metadata );
119
+ assertThat (result .holder ).isNotNull ();
120
+ assertThat (result .holder .json ).isNotNull ();
121
+ }
122
+
123
+ @ Test // gh-585
124
+ void shouldApplyCustomWritingConverter () {
125
+
126
+ WithJsonHolder object = new WithJsonHolder (new JsonHolder (Json .of ("{\" hello\" :\" world\" }" )));
127
+
128
+ OutboundRow row = new OutboundRow ();
129
+ converter .write (object , row );
130
+
131
+ Parameter parameter = row .get (SqlIdentifier .unquoted ("holder" ));
132
+ assertThat (parameter ).isNotNull ();
133
+ assertThat (parameter .getValue ()).isInstanceOf (Json .class );
134
+ }
135
+
102
136
@ AllArgsConstructor
103
137
static class JsonPerson {
104
138
@@ -116,4 +150,60 @@ static class ConvertedJson {
116
150
117
151
byte [] jsonBytes ;
118
152
}
153
+
154
+ @ AllArgsConstructor
155
+ static class WithJsonHolder {
156
+
157
+ JsonHolder holder ;
158
+ }
159
+
160
+ @ ReadingConverter
161
+ enum JsonToJsonHolderConverter implements GenericConverter , ConditionalConverter {
162
+
163
+ INSTANCE ;
164
+
165
+ @ Override
166
+ public boolean matches (TypeDescriptor sourceType , TypeDescriptor targetType ) {
167
+ return Json .class .isAssignableFrom (sourceType .getType ());
168
+ }
169
+
170
+ @ Override
171
+ public Set <ConvertiblePair > getConvertibleTypes () {
172
+ return Collections .singleton (new GenericConverter .ConvertiblePair (Json .class , Object .class ));
173
+ }
174
+
175
+ @ Override
176
+ public Object convert (Object source , TypeDescriptor sourceType , TypeDescriptor targetType ) {
177
+ return new JsonHolder ((Json ) source );
178
+ }
179
+ }
180
+
181
+ @ WritingConverter
182
+ enum JsonHolderToJsonConverter implements GenericConverter , ConditionalConverter {
183
+
184
+ INSTANCE ;
185
+
186
+ @ Override
187
+ public boolean matches (TypeDescriptor sourceType , TypeDescriptor targetType ) {
188
+ return JsonHolder .class .isAssignableFrom (sourceType .getType ());
189
+ }
190
+
191
+ @ Override
192
+ public Set <ConvertiblePair > getConvertibleTypes () {
193
+ return Collections .singleton (new GenericConverter .ConvertiblePair (JsonHolder .class , Json .class ));
194
+ }
195
+
196
+ @ Override
197
+ public Object convert (Object source , TypeDescriptor sourceType , TypeDescriptor targetType ) {
198
+ return ((JsonHolder ) source ).json ;
199
+ }
200
+ }
201
+
202
+ @ AllArgsConstructor
203
+ private static class JsonHolder {
204
+
205
+ private final Json json ;
206
+
207
+ }
208
+
119
209
}
0 commit comments