Swagger показывает Mongo ObjectId как сложный JSON вместо String - PullRequest
0 голосов
/ 14 октября 2019

Настройка проекта

У меня есть проект 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 свойство:

enter image description here

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

1 Ответ

0 голосов
/ 14 октября 2019

Мне не удалось заставить @ApiModelProperty(dataType = "") работать, но я нашел более удобный способ настройки прямой замены в конфигурации Swagger с использованием метода directModelSubstitute экземпляра Docket в этого ответа .

@Configuration
@EnableSwagger2
class SwaggerConfig() {
    @Bean
    fun api(): Docket {
        return Docket(DocumentationType.SWAGGER_2)
                .directModelSubstitute(ObjectId::class.java, String::class.java)
    }
}

Эквивалент Java:

@Bean
public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
            .directModelSubstitute(ObjectId.class, String.class);
}
...