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<AttributeItem>
和Map<String, AttributeItem>
。此外,您可以指定要与 @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 自定义转换器的主要内容,如果未能解决你的问题,请参考以下文章
如何在@RequestBody 中自定义将字符串转换为枚举?