Kotlin Dynamo DB 自定义转换器

Posted

技术标签:

【中文标题】Kotlin Dynamo DB 自定义转换器【英文标题】:Kotlin Dynamo DB custom converter 【发布时间】:2022-01-14 00:21:12 【问题描述】:

我有一个复杂的 obj 存储在 dynamo db 中,我正在尝试使用我的转换器类对其进行序列化。

问题是发电机包装器仍在使用默认方法,我无法让调试器访问我覆盖的方法。

有没有我遗漏的配置?

@DynamoDBTable(tableName = "")
data class DynamoDataClass
(

        @DynamoDBHashKey
        var msgId: String = "",

        @DynamoDBTypeConverted(converter = MetaConverter::class)
        @DynamoDBAttribute
        var meta: Map<String, Object> = HashMap(),
        
        @DynamoDBTypeConverted(converter = PayloadConverter::class)
        @DynamoDBAttribute
        var payload: List<Map<String, Object>> = ArrayList()
)
        constructor(): this(
                msgId = "",
                meta = HashMap(),
                payload = ArrayList()
        )


class PayloadConverter : DynamoDBTypeConverter<String, List<Map<String, Object>>> 
        override fun convert(`object`: List<Map<String, Object>>): String 
                val itemMeta: Map<String, Object> = `object` as Map<String, Object>
                var meta: String = ""
                try 
                        if (itemMeta != null) 
                                meta = itemMeta.toString()
                        
                 catch (e: Exception) 
                        e.printStackTrace()
                
                return meta
        

        override fun unconvert(s: String): List<Map<String, Object>> 
                val itemMeta = ArrayList<HashMap<String, Object>>()
                try 
                        var a = 1
                        var b = 2
                 catch (e: Exception) 
                        e.printStackTrace()
                
                return itemMeta
        


class MetaConverter : DynamoDBTypeConverter<String, Map<String, Object>> 
        override fun convert(`object`: Map<String, Object>): String 
                val itemMeta: Map<String, Object> = `object` as Map<String, Object>
                var meta: String = ""
                try 
                        if (itemMeta != null) 
                                meta = itemMeta.toString()
                        
                 catch (e: Exception) 
                        e.printStackTrace()
                
                return meta
        

        override fun unconvert(s: String): Map<String, Object> 
                val itemMeta = HashMap<String, Object>()
                try 
                        var a = 1
                        var b = 2
                 catch (e: Exception) 
                        e.printStackTrace()
                
                return itemMeta
        

重写方法的主体并不重要,因为我想先看看为什么不使用它们。转换逻辑稍后添加

【问题讨论】:

嗨,当您谈论您的“覆盖”方法时,您不是指“覆盖”的方法吗?被覆盖的方法是您要覆盖的默认方法。问候 【参考方案1】:

我已经在回答here 中回答了这个问题。

要使用自定义转换器,您需要在参数类型中使用AttributeValue,例如List&lt;AttributeItem&gt;Map&lt;String, AttributeItem&gt;。此外,您可以指定要与 @DynamoDBTypeConverted(converter = MyConverter::class) 注释一起使用的自定义转换器,并将其作为值传递给转换器参数。

这是我上面回答的代码摘录:

data class MyModelDB(

    @DynamoDBHashKey(attributeName = "id")
    var id: String = "",

    @DynamoDBAttribute(attributeName = "myMap")
    @DynamoDBTypeConverted(converter = MapConverter::class)
    var myMap: Map<String, AttributeValue> = mutableMapOf(),

    @DynamoDBAttribute(attributeName = "myList")
    @DynamoDBTypeConverted(converter = ListConverter::class)
    var myList: List<AttributeItem> = mutableListOf(),
) 
    constructor() : this(id = "", myMap = MyMap(), myList = mutableListOf())


class MapConverter : DynamoDBTypeConverter<AttributeValue, Map<String,AttributeValue>> 
    override fun convert(map: Map<String,AttributeValue>>): AttributeValue 
        return AttributeValue().withM(map)
    

    override fun unconvert(itemMap: AttributeValue?): Map<String,AttributeValue>>? 
        return itemMap?.m
    



class ListConverter : DynamoDBTypeConverter<AttributeValue, List<AttributeValue>> 
    override fun convert(list: List<AttributeValue>): AttributeValue 
        return AttributeValue().withL(list)
    

    override fun unconvert(itemList: AttributeValue?): List<AttributeValue>? 
        return itemList?.l
    


【讨论】:

以上是关于Kotlin Dynamo DB 自定义转换器的主要内容,如果未能解决你的问题,请参考以下文章

使用排序键的无服务器框架 Dynamo DB 表资源定义

如何在@RequestBody 中自定义将字符串转换为枚举?

JOOQ多字段自定义类型转换器

EF dbcontext 在 dynamo 自定义节点中返回一个空的 dbset

Kotlin实战——Kotlin基础

Kotlin实战——Kotlin基础