如何在Kotlin对象中动态添加键值对



我有Spring Boot REST api,它返回如下的JSON对象-

{
"id": "1"
"timestamp": "2020-08-03T08:49:02.679+00:00"
"message": "hello"
}

这是直接从@Entity派生出来的,就像这样-

fun getMessage(id: Long) = messageRepository.findById(id)

在这里,Spring引导会自动将响应转换为JSON。但是,我想在getMessage()函数中添加另一个键值对。类似于此-如何向JavaScript对象添加键/值对?但是在Java/Kotlin中。

我该怎么做?

也许您可以为此创建另一个模型,并创建一个扩展以转换为新模型。

data class Message(
val id: Int,
val timestamp: String, 
val message: String   
)
data class MessageWithMoreInfo(
val id: Int,
val timestamp: String, 
val message: String,
val info: String   
)
fun Message.toMessageWithMoreInfo(val info: String) = MessageWithMoreInfo(
id,
timestamp,
message,
info
)

您将无法复制javascript注入密钥的方式&值转换为对象,因为Java(和Kotlin(是一种静态类型语言。

Spring转变为Json并不是魔法。它很可能会用对象映射器(Jackson或Gson(序列化实体。

现在,你可以在很多方面绕过这个限制(有些比其他更好(,卢西亚诺的答案是最好的答案之一。

但是,根据您向实体中注入的内容以及项目设计的定义方式,您可以使用spring上下文提供的Object Mapper来完成javascript所做的操作,并将实体转换为Map<字符串,任意>:

@Service
class AServiceImpl(
private val repository: ARepository,
// autowires the objectMapper
private val objectMapper: ObjectMapper
) : AService {
override fun getMessage(id: Long): Map<String, Any>{
val entity = repository.findById(id)
// here you have something more like a javascript Object 
val map: MutableMap<String, Any> = objectMapper.convertValue(entity)
// so you can add key/value pairs to it
map["something"] = "some_value"
// but you will need to change the method signature 
return map
}
}

记住:传递地图有点危险,你会失去Java/Kotlin带来的许多好处:(

最新更新