7272import software .amazon .awssdk .enhanced .dynamodb .internal .converter .attribute .ZoneIdAttributeConverter ;
7373import software .amazon .awssdk .enhanced .dynamodb .internal .converter .attribute .ZoneOffsetAttributeConverter ;
7474import software .amazon .awssdk .enhanced .dynamodb .internal .converter .attribute .ZonedDateTimeAsStringAttributeConverter ;
75+ import software .amazon .awssdk .utils .CollectionUtils ;
7576import software .amazon .awssdk .utils .Logger ;
7677import software .amazon .awssdk .utils .Validate ;
7778
@@ -157,17 +158,21 @@ private <T> Optional<AttributeConverter<T>> findConverterInternal(EnhancedType<T
157158 return Optional .of (converter );
158159 }
159160
160- if (type .rawClass ().isAssignableFrom (Map .class )) {
161- converter = createMapConverter (type );
162- } else if (type .rawClass ().isAssignableFrom (Set .class )) {
163- converter = createSetConverter (type );
164- } else if (type .rawClass ().isAssignableFrom (List .class )) {
165- EnhancedType <T > innerType = (EnhancedType <T >) type .rawClassParameters ().get (0 );
166- AttributeConverter <?> innerConverter = findConverter (innerType )
167- .orElseThrow (() -> new IllegalStateException ("Converter not found for " + type ));
168- return Optional .of ((AttributeConverter <T >) ListAttributeConverter .create (innerConverter ));
169- } else if (type .rawClass ().isEnum ()) {
170- return Optional .of (EnumAttributeConverter .create (((EnhancedType <? extends Enum >) type ).rawClass ()));
161+ if (!Object .class .equals (type .rawClass ())) {
162+ if (type .rawClass ().isAssignableFrom (Map .class )) {
163+ requireTypeParameters (type );
164+ converter = createMapConverter (type );
165+ } else if (type .rawClass ().isAssignableFrom (Set .class )) {
166+ requireTypeParameters (type );
167+ converter = createSetConverter (type );
168+ } else if (type .rawClass ().isAssignableFrom (List .class )) {
169+ requireTypeParameters (type );
170+ EnhancedType <T > innerType = (EnhancedType <T >) type .rawClassParameters ().get (0 );
171+ AttributeConverter <?> innerConverter = converterFor (innerType );
172+ return Optional .of ((AttributeConverter <T >) ListAttributeConverter .create (innerConverter ));
173+ } else if (type .rawClass ().isEnum ()) {
174+ return Optional .of (EnumAttributeConverter .create (((EnhancedType <? extends Enum >) type ).rawClass ()));
175+ }
171176 }
172177
173178 if (type .tableSchema ().isPresent ()) {
@@ -186,23 +191,27 @@ private boolean shouldCache(Class<?> type) {
186191 return !type .isAnonymousClass ();
187192 }
188193
194+ private static void requireTypeParameters (EnhancedType <?> type ) {
195+ if (CollectionUtils .isNullOrEmpty (type .rawClassParameters ())) {
196+ throw new IllegalStateException ("Converter not found for " + type + ". Type parameters are required for this type." );
197+ }
198+ }
199+
189200 @ SuppressWarnings ("unchecked" )
190201 private <T > AttributeConverter <T > createMapConverter (EnhancedType <T > type ) {
191202 EnhancedType <?> keyType = type .rawClassParameters ().get (0 );
192203 EnhancedType <T > valueType = (EnhancedType <T >) type .rawClassParameters ().get (1 );
193204
194205 StringConverter <?> keyConverter = StringConverterProvider .defaultProvider ().converterFor (keyType );
195- AttributeConverter <?> valueConverter = findConverter (valueType )
196- .orElseThrow (() -> new IllegalStateException ("Converter not found for " + type ));
206+ AttributeConverter <?> valueConverter = converterFor (valueType );
197207
198208 return (AttributeConverter <T >) MapAttributeConverter .mapConverter (keyConverter , valueConverter );
199209 }
200210
201211 @ SuppressWarnings ("unchecked" )
202212 private <T > AttributeConverter <T > createSetConverter (EnhancedType <T > type ) {
203213 EnhancedType <T > innerType = (EnhancedType <T >) type .rawClassParameters ().get (0 );
204- AttributeConverter <?> innerConverter = findConverter (innerType )
205- .orElseThrow (() -> new IllegalStateException ("Converter not found for " + type ));
214+ AttributeConverter <?> innerConverter = converterFor (innerType );
206215
207216 return (AttributeConverter <T >) SetAttributeConverter .setConverter (innerConverter );
208217 }
0 commit comments