gpt4 book ai didi

spring - 使用具体实现时 @JsonTypeInfo 对 REST 端点的影响

转载 作者:行者123 更新时间:2023-12-02 13:44:13 25 4
gpt4 key购买 nike

我想知道添加 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class") 的效果。到一个界面。

我的用例是我有一个带有许多子类型的接口(interface)消息。我希望能够在一个端点中反序列化和序列化消息列表。

我的类(class):

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
interface Message: Serializable

data class Message1(
val name: String,
val age: Int
)

data class Message2(
val name: String,
val nickName: String
)


以及各自的端点:
@RestController
class MessageController {

@GetMapping("/messages")
fun getEndpoints(): List<Message> {
return listOf(
Message1("Marco", 22),
Message2("Polo", "Poli")
)
}
}

到目前为止一切顺利 - 但现在我想要另一个使用显式类之一的端点,并且在我的测试中得到一个序列化错误 @class丢失了-无论如何,当我使用具体类时,我不想发送它。
@RestController
class MessageController {

@PostMapping("/add1")
fun add(@RequestBody content: Message1) {
// do something
}
}
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Missing type id when trying to resolve subtype of [simple type, class com.tractive.tap.message.request.RequestDataDTO]: missing type id property '@class'; nested exception is com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class com.tractive.tap.message.request.RequestDataDTO]: missing type id property '@class'
at [Source: (PushbackInputStream); line: 1, column: 51]

为什么是 @class即使我使用的是具体的类(class),也可以预期?这是预期的行为还是我做错了什么?

最佳答案

嗯,这是预期的,因为通过使用 @JsonTypeInfo 注释类- 通过类接口(interface)继承 - 您已明确指示您的 jackson 期待此信息。
@JsonTypeInfo接受参数defaultImpl类型 Class<?>将被使用

if type identifier is either not present, or can not be mapped to a registered type



您可以使用它将反序列化默认为一种类型的消息,最好是在您的 api 中明确使用的最广泛使用的消息。对于其他类型,您仍然需要包含 Jackson 的类(class)信息。

关于spring - 使用具体实现时 @JsonTypeInfo 对 REST 端点的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60449551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com