【问题标题】:How to dynamically add key value pairs in Kotlin object?如何在 Kotlin 对象中动态添加键值对?
【发布时间】:2020-08-16 12:41:05
【问题描述】:

我有 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 boot 自动将响应转换为 JSON。但是,我想在 getMessage() 函数中添加另一个键值对。与此类似 - How can I add a key/value pair to a JavaScript object? 但在 Java/Kotlin 中。

我该怎么做?

【问题讨论】:

    标签: spring-boot kotlin spring-kotlin


    【解决方案1】:

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

    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
    )
    

    【讨论】:

      【解决方案2】:

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

      Spring 转换为 Json 并不神奇。它很可能会使用对象映射器(Jackson 或 Gson)序列化您的实体。

      现在,您可以通过多种方式解决此限制(有些方法比其他方法更好),卢西亚诺的答案是最好的方法之一。

      但是,根据您注入实体的内容以及项目设计的定义方式,您可以通过使用 spring 上下文提供的 Object Mapper 并将您的 Entity 转换为 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 带来的许多好处 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 2014-05-20
        • 2022-06-29
        • 1970-01-01
        • 2016-09-21
        • 2020-04-17
        • 2015-11-30
        相关资源
        最近更新 更多