Я обновил AWS java SDK своего сервиса с внешнего выпуска 1.10 до 1.11.x и обнаружил, что поведение аннотации @DynamoDBTypeConverted, похоже, изменилось.
Этот код, используемый для компиляции:
@DynamoDBTypeConverted(converter = CustomObjectConverter.class)
public class Job {
private List<CustomObject> objects;
}
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTypeConverter;
public class CustomObjectConverter implements DynamoDBTypeConverter<String, CustomObject> {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final TypeReference reference = new TypeReference<CustomObject>() {};
@Override
public String convert(CustomObject customObject) {
try {
return OBJECT_MAPPER.writerWithType(reference).writeValueAsString(customObject)
} catch (Exception e) {
throw new RuntimeException(e)
}
@Override
public CustomObject unconvert(String object) {
try {
return OBJECT_MAPPER.readValue(object, reference);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Внешний выпуск 1.10 не имел проблем с использованием аннотации на List<CustomObject>
, как если бы он знал, что должен применять конвертер к ОБЪЕКТАМ в списке, а не к самому списку.После обновления SDK до 1.11.x я попытался запустить код, похожий на этот псевдокод:
fakeDb = DynamoDBEmbedded.create().amazonDynamoDB();
mapper = new DynamoDBMapper(fakeDb, new DynamoDBMapperConfig(withTableNameReplacement("testTable")));
// create table and stuff
mapper.save(new Job(ImmutableList.of(new CustomObject("")))
, и запустил это исключение
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Job[objects]; could not convert attribute
...
Caused by: java.lang.ClassCastException: com.google.common.collect.SingletonImmutableList cannot be cast to ....CustomObject
Похоже, что после обновления он пытаетсяприменить конвертер к самому List
, а не к CustomObjects
внутри него.Мне все еще нужно сериализовать объекты внутри, а не List
, поэтому мне интересно, какой подход я должен использовать.