【发布时间】:2019-10-14 11:15:10
【问题描述】:
项目设置
我有一个 Kotlin Spring Boot 2.0 项目,它公开了一个返回 MongoDB 模型的 @RestController API。比如这个模型和控制器:
@RestController
@RequestMapping("/api/accounts")
class AccountsController() {
@GetMapping
fun list(): List<Account> {
return listOf(Account(ObjectId(), "Account 1"), Account(ObjectId(), "Account 2"), Account(ObjectId(), "Account 3"))
}
}
@Document
data class Account(
@Id val id: ObjectId? = null,
val name: String
)
这些模型具有 ObjectId 标识符,但在 API 中,我希望它们被视为普通的 String(即默认行为而不是复杂的 JSON)。
为此,我创建了这些组件来配置 Spring Boot 参数绑定和 JSON 解析:
@JsonComponent
class ObjectIdJsonSerializer : JsonSerializer<ObjectId>() {
override fun serialize(value: ObjectId?, gen: JsonGenerator?, serializers: SerializerProvider?) {
if (value == null || gen == null) return
gen.writeString(value.toHexString())
}
}
@JsonComponent
class ObjectIdJsonDeserializer : JsonDeserializer<ObjectId>() {
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): ObjectId? {
if (p == null) return null
val text = p.getCodec().readTree<TextNode>(p).textValue()
return ObjectId(text)
}
}
@Component
class StringToObjectIdConverter : Converter<String, ObjectId> {
override fun convert(source: String): ObjectId? {
return ObjectId(source)
}
}
到目前为止,这按预期工作,对 API 的调用返回此 JSON:
[
{
"id": "5da454f4307b0a8b30838839",
"name": "Account 1"
},
{
"id": "5da454f4307b0a8b3083883a",
"name": "Account 2"
},
{
"id": "5da454f4307b0a8b3083883b",
"name": "Account 3"
}
]
问题
将 Swagger 集成到项目中时出现问题,文档显示调用此方法返回复杂的 JSON,而不是作为 id 属性的普通 String:
将@ApiModelProperty(dataType = "string") 添加到id 字段没有任何区别,如果不将项目中的所有id 字段更改为String,我找不到解决方法。任何帮助将不胜感激。
【问题讨论】:
-
也许我在 C# 中对这个问题的解决方案对你有用:stackoverflow.com/a/59800065/908936
标签: spring spring-boot kotlin swagger swagger-ui