2020import static de .exlll .configlib .Validator .requireNonNull ;
2121
2222final class SerializerSelector {
23- private static final Map <Class <?>, Serializer <?, ?>> DEFAULT_SERIALIZERS = Map .ofEntries (
23+ private static final Map <Class <?>, Serializer <?, ?>> STATIC_DEFAULT_SERIALIZERS = Map .ofEntries (
2424 Map .entry (boolean .class , new BooleanSerializer ()),
2525 Map .entry (Boolean .class , new BooleanSerializer ()),
2626 Map .entry (byte .class , new NumberSerializer (byte .class )),
@@ -37,7 +37,6 @@ final class SerializerSelector {
3737 Map .entry (Double .class , new NumberSerializer (Double .class )),
3838 Map .entry (char .class , new CharacterSerializer ()),
3939 Map .entry (Character .class , new CharacterSerializer ()),
40- Map .entry (String .class , new StringSerializer ()),
4140 Map .entry (BigInteger .class , new BigIntegerSerializer ()),
4241 Map .entry (BigDecimal .class , new BigDecimalSerializer ()),
4342 Map .entry (LocalDate .class , new LocalDateSerializer ()),
@@ -51,6 +50,8 @@ final class SerializerSelector {
5150 Map .entry (URI .class , new UriSerializer ())
5251 );
5352 private final ConfigurationProperties properties ;
53+ private final Map <Class <?>, Serializer <?, ?>> configurableDefaultSerializers ;
54+
5455 /**
5556 * Holds the last {@link #select}ed configuration element.
5657 */
@@ -66,6 +67,10 @@ final class SerializerSelector {
6667
6768 public SerializerSelector (ConfigurationProperties properties ) {
6869 this .properties = requireNonNull (properties , "configuration properties" );
70+ this .configurableDefaultSerializers = Map .of (
71+ String .class ,
72+ new StringCoercingSerializer (properties .getDeserializationCoercionTypes ())
73+ );
6974 }
7075
7176 public Serializer <?, ?> select (ConfigurationElement <?> element ) {
@@ -186,8 +191,10 @@ public SerializerSelector(ConfigurationProperties properties) {
186191
187192 private Serializer <?, ?> selectForClass (AnnotatedType annotatedType ) {
188193 final Class <?> cls = (Class <?>) annotatedType .getType ();
189- if (DEFAULT_SERIALIZERS .containsKey (cls ))
190- return DEFAULT_SERIALIZERS .get (cls );
194+ if (STATIC_DEFAULT_SERIALIZERS .containsKey (cls ))
195+ return STATIC_DEFAULT_SERIALIZERS .get (cls );
196+ if (configurableDefaultSerializers .containsKey (cls ))
197+ return configurableDefaultSerializers .get (cls );
191198 if (Reflect .isEnumType (cls )) {
192199 // The following cast won't fail because we just checked that it's an enum.
193200 @ SuppressWarnings ("unchecked" )
@@ -249,7 +256,8 @@ public SerializerSelector(ConfigurationProperties properties) {
249256 : new SetSerializer <>(elementSerializer , outputNulls , inputNulls );
250257 } else if (Reflect .isMapType (rawType )) {
251258 if ((typeArgs [0 ].getType () instanceof Class <?> cls ) &&
252- (DEFAULT_SERIALIZERS .containsKey (cls ) ||
259+ (STATIC_DEFAULT_SERIALIZERS .containsKey (cls ) ||
260+ configurableDefaultSerializers .containsKey (cls ) ||
253261 Reflect .isEnumType (cls ))) {
254262 var keySerializer = selectForClass (typeArgs [0 ]);
255263 var valSerializer = selectForType (typeArgs [1 ]);
0 commit comments