0

我有 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()但是,我想在函数中添加另一个键值对。与此类似 -如何将键/值对添加到 JavaScript 对象?但在 Java/Kotlin 中。

我怎么做?

4

2 回答 2

3

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

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
)
于 2020-08-16T14:50:49.730 回答
1

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

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

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

但是,根据您注入实体的内容以及项目设计的定义方式,您可以通过使用 spring 上下文提供的 Object Mapper 并将您的实体转换为 Map<String, Any> 来完成 javascript 所做的事情:

@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 带来的许多好处 :)

于 2020-08-23T15:28:57.420 回答