1818import java .util .Arrays ;
1919import java .util .Collections ;
2020import java .util .EnumSet ;
21- import java .util .HashMap ;
2221import java .util .List ;
2322import java .util .Map ;
2423import java .util .Objects ;
2524import java .util .Optional ;
25+ import java .util .concurrent .ConcurrentHashMap ;
2626
2727import org .springframework .beans .BeanUtils ;
2828import org .springframework .beans .factory .BeanFactory ;
29- import org .springframework .beans .factory .NoSuchBeanDefinitionException ;
3029import org .springframework .beans .factory .config .AutowireCapableBeanFactory ;
3130import org .springframework .data .mapping .PersistentProperty ;
3231import org .springframework .lang .Nullable ;
@@ -120,29 +119,26 @@ static class BeanFactoryAwarePropertyValueConverterFactory implements PropertyVa
120119 }
121120
122121 @ Override
123- public <S , T , C extends ValueConversionContext <?>> PropertyValueConverter <S , T , C > getConverter (
124- Class <? extends PropertyValueConverter <S , T , C >> converterType ) {
122+ public <DV , SV , C extends ValueConversionContext <?>> PropertyValueConverter <DV , SV , C > getConverter (
123+ Class <? extends PropertyValueConverter <DV , SV , C >> converterType ) {
125124
126- Assert .state (beanFactory != null , "BeanFactory must not be null. Did you forget to set it!" );
127125 Assert .notNull (converterType , "ConverterType must not be null!" );
128126
129- try {
130- return beanFactory .getBean (converterType );
131- } catch (NoSuchBeanDefinitionException exception ) {
127+ PropertyValueConverter <DV , SV , C > converter = beanFactory .getBeanProvider (converterType ).getIfAvailable ();
132128
133- if (beanFactory instanceof AutowireCapableBeanFactory ) {
134- return (PropertyValueConverter <S , T , C >) ((AutowireCapableBeanFactory ) beanFactory ).createBean (converterType ,
135- AutowireCapableBeanFactory .AUTOWIRE_CONSTRUCTOR , false );
136- }
129+ if (converter == null && beanFactory instanceof AutowireCapableBeanFactory ) {
130+ return (PropertyValueConverter <DV , SV , C >) ((AutowireCapableBeanFactory ) beanFactory ).createBean (converterType ,
131+ AutowireCapableBeanFactory .AUTOWIRE_CONSTRUCTOR , false );
137132 }
138- return null ;
133+
134+ return converter ;
139135 }
140136 }
141137
142138 /**
143139 * {@link PropertyValueConverterFactory} implementation that serves {@link PropertyValueConverter} from a given
144140 * {@link ValueConverterRegistry registry}.
145- *
141+ *
146142 * @author Christoph Strobl
147143 * @since 2.7
148144 */
@@ -158,9 +154,9 @@ static class ConfiguredInstanceServingValueConverterFactory implements PropertyV
158154
159155 @ Nullable
160156 @ Override
161- public <A , B , C extends ValueConversionContext <?>> PropertyValueConverter <A , B , C > getConverter (
157+ public <DV , SV , C extends ValueConversionContext <?>> PropertyValueConverter <DV , SV , C > getConverter (
162158 PersistentProperty <?> property ) {
163- return (PropertyValueConverter <A , B , C >) converterRegistry .getConverter (property .getOwner ().getType (),
159+ return (PropertyValueConverter <DV , SV , C >) converterRegistry .getConverter (property .getOwner ().getType (),
164160 property .getName ());
165161 }
166162
@@ -174,7 +170,7 @@ public <S, T, C extends ValueConversionContext<?>> PropertyValueConverter<S, T,
174170 /**
175171 * {@link PropertyValueConverterFactory} implementation that caches converters provided by an underlying
176172 * {@link PropertyValueConverterFactory factory}.
177- *
173+ *
178174 * @author Christoph Strobl
179175 * @since 2.7
180176 */
@@ -191,7 +187,7 @@ static class CachingPropertyValueConverterFactory implements PropertyValueConver
191187
192188 @ Nullable
193189 @ Override
194- public <S , T , C extends ValueConversionContext <?>> PropertyValueConverter <S , T , C > getConverter (
190+ public <DV , SV , C extends ValueConversionContext <?>> PropertyValueConverter <DV , SV , C > getConverter (
195191 PersistentProperty <?> property ) {
196192
197193 Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>> converter = cache .get (property );
@@ -201,8 +197,8 @@ public <S, T, C extends ValueConversionContext<?>> PropertyValueConverter<S, T,
201197 }
202198
203199 @ Override
204- public <S , T , C extends ValueConversionContext <?>> PropertyValueConverter <S , T , C > getConverter (
205- Class <? extends PropertyValueConverter <S , T , C >> converterType ) {
200+ public <DV , SV , C extends ValueConversionContext <?>> PropertyValueConverter <DV , SV , C > getConverter (
201+ Class <? extends PropertyValueConverter <DV , SV , C >> converterType ) {
206202
207203 Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>> converter = cache .get (converterType );
208204
@@ -212,8 +208,8 @@ public <S, T, C extends ValueConversionContext<?>> PropertyValueConverter<S, T,
212208
213209 static class Cache {
214210
215- Map <PersistentProperty <?>, Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>>> perPropertyCache = new HashMap <>();
216- Map <Class <?>, Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>>> typeCache = new HashMap <>();
211+ Map <PersistentProperty <?>, Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>>> perPropertyCache = new ConcurrentHashMap <>();
212+ Map <Class <?>, Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>>> typeCache = new ConcurrentHashMap <>();
217213
218214 Optional <PropertyValueConverter <?, ?, ? extends ValueConversionContext <?>>> get (PersistentProperty <?> property ) {
219215 return perPropertyCache .get (property );
@@ -226,7 +222,12 @@ static class Cache {
226222 <S , T , C extends ValueConversionContext <?>> PropertyValueConverter <S , T , C > cache (PersistentProperty <?> property ,
227223 @ Nullable PropertyValueConverter <S , T , C > converter ) {
228224 perPropertyCache .putIfAbsent (property , Optional .ofNullable (converter ));
229- cache (property .getValueConverterType (), converter );
225+
226+ Class <? extends PropertyValueConverter <?, ?, ? extends ValueConversionContext <? extends PersistentProperty <?>>>> valueConverterType = property
227+ .getValueConverterType ();
228+ if (valueConverterType != null ) {
229+ cache (valueConverterType , converter );
230+ }
230231 return converter ;
231232 }
232233
0 commit comments