Я строю Spring Webflux API с Kotlin и использую сериализацию Kotlinx для сериализации JSON.plugins {
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.kotlin.spring)
alias(libs.plugins.spring.boot)
alias(libs.plugins.spring.dependency.management)
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-webflux:3.5.3")
{
exclude(group = "com.fasterxml.jackson.core", module = "jackson-databind")
exclude(group = "com.fasterxml.jackson.module", module = "jackson-module-kotlin")
}
implementation(libs.kotlinX.serialization)
}
< /code>
libs.version.toml-
[versions]
spring = "3.5.3"
kotlin = "2.2.0"
serialization = "1.9.0"
kotlinX-serialization = {module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
[plugins]
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-spring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
spring-boot = { id = "org.springframework.boot", version.ref = "spring" }
spring-dependency-management = { id = "io.spring.dependency-management", version = "1.1.7" }
< /code>
Мой метод контроллера выглядит следующим образом: < /p>
@GetMapping("/trainSch", produces = [MediaType.APPLICATION_JSON_VALUE])
suspend fun getTrainSch(
@RequestParam("trainNo") trainNumber: String
): ResponseEntity {
return ResponseEntity.ok(
TrainDetails(
no = trainNumber,
na = "Superfast Express",
typ = 1,
zn = 5,
dly = 10,
rake = "LHB",
classes = 3,
upd = "10:45 AM"
)
)
}
< /code>
traindetails - это класс данных Kotlin: < /p>
@Serializable
data class TrainDetails(
val no: String,
val na: String,
val typ: Int,
val zn: Int,
val dly: Int,
val rake: String,
val classes: Int,
val upd: String
)
Я зарегистрировал энкодер/декодер Kotlinx Serialization с помощью Bean -Bean Webfluxconfigurer:
@Bean
fun webFluxConfigurer(
encoder: KotlinSerializationJsonEncoder,
decoder: KotlinSerializationJsonDecoder
): WebFluxConfigurer = object : WebFluxConfigurer {
override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
configurer.defaultCodecs().kotlinSerializationJsonEncoder(encoder)
configurer.defaultCodecs().kotlinSerializationJsonDecoder(decoder)
}
}
< /code>
Проблема:
Когда я делаю запрос получить запрос на /trainsch? Trainno = 12345, журналы отладки показывают: < /p>
TRACE ... CharSequenceEncoder : Writing "{\"no\":\"12345\",\"na\":\"Superfast Express\",...}"
< /code>
вместо: < /p>
TRACE ... KotlinSerializationJsonEncoder : Writing {...}
< /code>
Похоже, что Spring использует chareSecenceEncoder (который кодирует строки) вместо моего энкодера Kotlinx json.Content-Type:application/json
content-encoding:gzip
content-length:123
{
"no": "12232",
"na": "Superfast Express",
"typ": 1,
"dly": 10,
"zn": 5,
"rake": "LHB",
"classes": 3,
"upd": "10:45 AM"
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... lizationjs