Modelando tipos complejos para DynamoDB en Kotlin
Tengo una tabla de DynamoDB a la que necesito leer/escribir. Estoy tratando de crear un modelo para leer y escribir desde DynamoDB con Kotlin. Pero continuamente me encuentro con el error com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: MyModelDB [myMap]; no se pudo convertir el atributo
cuando ejecuto dynamoDBMapper.scanPage(...)
. A veces, en lugar de myMap
, será MyListOfMaps
, pero supongo que se debe a la iteración de las claves de un Map.
Mi código es el siguiente:
@DynamoDBTable(tableName = "") // No es un problema, estoy asignando el nombre de la tabla en el DynamoDBMapper
data class MyModelDB(
@DynamoDBHashKey(attributeName = "id")
var id: String,
@DynamoDBAttribute(attributeName = "myMap")
var myMap: MyMap,
@DynamoDBAttribute(attributeName = "MyListOfMapItems")
var myListOfMapItems: List<mymapitem>,
) {
constructor() : this(id = "", myMap = MyMap(), myListOfMaps = mutableListOf())
@DynamoDBDocument
class MyMap {
@get:DynamoDBAttribute(attributeName = "myMapAttr")
var myMapAttr: MyMapAttr = MyMapAttr()
@DynamoDBDocument
class MyMapAttr {
@get:DynamoDBAttribute(attributeName = "stringValue")
var stringValue: String = ""
}
}
@DynamoDBDocument
class MyMapItem {
@get:DynamoDBAttribute(attributeName = "myMapItemAttr")
var myMapItemAttr: String = ""
}
}
Estoy utilizando el paquete com.amazonaws:aws-java-sdk-dynamodb:1.11.500
y mi dynamoDBMapper
se inicializa con DynamoDBMapperConfig.Builder().build()
(junto con algunas otras configuraciones).
Mi pregunta es ¿qué estoy haciendo mal y por qué? También he visto que algunas implementaciones en Java utilizan DynamoDBTypeConverter
. ¿Es mejor y debería usar eso en su lugar?
¡Se agradecerían ejemplos!
davy.ai
Parece que el problema está en la asignación de los atributos
myMap
ymyListOfMapItems
en tu tabla de DynamoDB a tu clase de datosMyModelDB
en Kotlin. El mensaje de excepción que estás viendo indica que hay un problema al convertir los valores de atributo de DynamoDB a tu clase de datos en Kotlin.Un posible problema es que los tipos de atributos en tu tabla de DynamoDB no coinciden con los tipos de propiedades correspondientes en tu clase de datos en Kotlin. Por ejemplo, si el atributo
myMap
en DynamoDB tiene un valor de cadena, pero tu propiedadmyMap
enMyModelDB
es un objeto de tipoMyMap
, ocurrirá un error de conversión.Otro posible problema es que la estructura de datos de tus clases
MyMap
yMyMapItem
no es compatible con el modelo de datos de DynamoDB. DynamoDB tiene requisitos específicos para nombres de atributos y tipos de datos que pueden no coincidir con la estructura de tu clase de datos en Kotlin.Una forma de resolver este problema es utilizar un
DynamoDBTypeConverter
para mapear el atributo de DynamoDB a un tipo de Kotlin compatible. Puedes crear un convertidor de tipoDynamoDBTypeConverter
personalizado para cada tipo de datos que necesites convertir. Por ejemplo, podrías crear un convertidor de tipo para un tipo de datosMap<string, string="">
y utilizarlo para convertir el atributomyMap
en tu claseMyModelDB
.Aquí tienes un ejemplo de cómo podrías modificar tu clase
MyModelDB
para utilizar unDynamoDBTypeConverter
para el atributomyMap
:En este ejemplo, la propiedad
myMap
ahora se declara como unMap<string, string="">
y se anota con@DynamoDBTypeConverted
para indicar que debe convertirse utilizando elMyMapConverter
DynamoDBTypeConverter
. La claseMyMapConverter
implementa la interfazDynamoDBTypeConverter
y proporciona métodos para convertir el Map<string, string=””> a una cadena JSON y viceversa, que es un formato compatible con DynamoDB.Puedes implementar clases
DynamoDBTypeConverter
similares para otros tipos de datos que necesites convertir, comoList<mymapitem>
.</string,></string,></string,></string,></string,></string,></string,></string,></string,></string,>