Настройка проекта
У меня есть проект Kotlin Spring Boot 2.0, который предоставляет API @RestController
, который возвращает модели MongoDB. Например, эта модель и контроллер:
@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 вместо простого String
в качествеid
свойство:

Добавление @ApiModelProperty(dataType = "string")
в поле id
не имело значения, и я не могу найти способ решитьбез изменения всех полей id
в проекте на String
. Любая помощь будет оценена.