@@ -2383,6 +2383,51 @@ void writeEmbeddedTypeWithComplexValue() {
23832383 .doesNotContainKey ("address.city" );
23842384 }
23852385
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+
23862431 static class GenericType <T > {
23872432 T content ;
23882433 }
@@ -2899,4 +2944,31 @@ public Person onAfterConvert(Person entity, org.bson.Document document, String c
28992944 }
29002945 }
29012946
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+ }
29022974}
0 commit comments