@@ -2383,6 +2383,51 @@ void writeEmbeddedTypeWithComplexValue() {
2383
2383
.doesNotContainKey ("address.city" );
2384
2384
}
2385
2385
2386
+ @ Test // GH-3580
2387
+ void shouldFallbackToConfiguredCustomConversionTargetOnRead () {
2388
+
2389
+ GenericTypeConverter genericTypeConverter = spy (new GenericTypeConverter ());
2390
+
2391
+ converter = new MappingMongoConverter (resolver , mappingContext );
2392
+ converter .setCustomConversions (MongoCustomConversions .create (it -> {
2393
+ it .registerConverter (genericTypeConverter );
2394
+ }));
2395
+ converter .afterPropertiesSet ();
2396
+
2397
+ org .bson .Document source = new org .bson .Document ("_class" , SubTypeOfGenericType .class .getName ()).append ("value" ,
2398
+ "v1" );
2399
+ GenericType target = converter .read (GenericType .class , source );
2400
+
2401
+ assertThat (target ).isInstanceOf (GenericType .class );
2402
+ assertThat (target .content ).isEqualTo ("v1" );
2403
+
2404
+ verify (genericTypeConverter ).convert (eq (source ));
2405
+ }
2406
+
2407
+ @ Test // GH-3580
2408
+ void shouldUseMostConcreteCustomConversionTargetOnRead () {
2409
+
2410
+ GenericTypeConverter genericTypeConverter = spy (new GenericTypeConverter ());
2411
+ SubTypeOfGenericTypeConverter subTypeOfGenericTypeConverter = spy (new SubTypeOfGenericTypeConverter ());
2412
+
2413
+ converter = new MappingMongoConverter (resolver , mappingContext );
2414
+ converter .setCustomConversions (MongoCustomConversions .create (it -> {
2415
+ it .registerConverter (genericTypeConverter );
2416
+ it .registerConverter (subTypeOfGenericTypeConverter );
2417
+ }));
2418
+ converter .afterPropertiesSet ();
2419
+
2420
+ org .bson .Document source = new org .bson .Document ("_class" , SubTypeOfGenericType .class .getName ()).append ("value" ,
2421
+ "v1" );
2422
+ GenericType target = converter .read (GenericType .class , source );
2423
+
2424
+ assertThat (target ).isInstanceOf (SubTypeOfGenericType .class );
2425
+ assertThat (target .content ).isEqualTo ("v1_s" );
2426
+
2427
+ verify (genericTypeConverter , never ()).convert (any ());
2428
+ verify (subTypeOfGenericTypeConverter ).convert (eq (source ));
2429
+ }
2430
+
2386
2431
static class GenericType <T > {
2387
2432
T content ;
2388
2433
}
@@ -2899,4 +2944,31 @@ public Person onAfterConvert(Person entity, org.bson.Document document, String c
2899
2944
}
2900
2945
}
2901
2946
2947
+ static class SubTypeOfGenericType extends GenericType <String > {
2948
+
2949
+ }
2950
+
2951
+ @ ReadingConverter
2952
+ static class GenericTypeConverter implements Converter <org .bson .Document , GenericType <?>> {
2953
+
2954
+ @ Override
2955
+ public GenericType <?> convert (org .bson .Document source ) {
2956
+
2957
+ GenericType <Object > target = new GenericType <>();
2958
+ target .content = source .get ("value" );
2959
+ return target ;
2960
+ }
2961
+ }
2962
+
2963
+ @ ReadingConverter
2964
+ static class SubTypeOfGenericTypeConverter implements Converter <org .bson .Document , SubTypeOfGenericType > {
2965
+
2966
+ @ Override
2967
+ public SubTypeOfGenericType convert (org .bson .Document source ) {
2968
+
2969
+ SubTypeOfGenericType target = new SubTypeOfGenericType ();
2970
+ target .content = source .getString ("value" ) + "_s" ;
2971
+ return target ;
2972
+ }
2973
+ }
2902
2974
}
0 commit comments