{"record":{"id":"dbd6366db78d0427","repo":"quarkusio/quarkus","slug":"could-not-find-the-namingstrategy-property-on-json","errorCode":null,"errorMessage":"Could not find the namingStrategy property on JsonBuilder","messagePattern":"Could not find the namingStrategy property on JsonBuilder","errorType":"exception","errorClass":"ReflectiveOperationException","httpStatus":null,"severity":"error","filePath":"extensions/resteasy-reactive/rest-kotlin-serialization-common/runtime/src/main/kotlin/io/quarkus/resteasy/reactive/kotlin/serialization/common/runtime/JsonProducer.kt","lineNumber":60,"sourceCode":"\n        configuration.json().namingStrategy().ifPresent { strategy ->\n            loadStrategy(this, strategy, this@JsonProducer)\n        }\n        val sortedCustomizers = sortCustomizersInDescendingPriorityOrder(customizers)\n        for (customizer in sortedCustomizers) {\n            customizer.customize(this)\n        }\n    }\n\n    @ExperimentalSerializationApi\n    private fun loadStrategy(\n        jsonBuilder: JsonBuilder,\n        strategy: String,\n        jsonProducer: JsonProducer,\n    ) {\n        val strategyProperty: KMutableProperty1<JsonBuilder, JsonNamingStrategy> =\n            (JsonBuilder::class.memberProperties.find { member -> member.name == \"namingStrategy\" }\n                ?: throw ReflectiveOperationException(\n                    \"Could not find the namingStrategy property on JsonBuilder\"\n                ))\n                as KMutableProperty1<JsonBuilder, JsonNamingStrategy>\n        strategyProperty.isAccessible = true\n\n        strategyProperty.set(\n            jsonBuilder,\n            if (strategy.startsWith(\"JsonNamingStrategy\")) {\n                jsonProducer.extractBuiltIn(strategy)\n            } else {\n                jsonProducer.loadStrategyClass(strategy)\n            },\n        )\n    }\n\n    @ExperimentalSerializationApi\n    private fun loadStrategyClass(strategy: String): JsonNamingStrategy {\n        try {","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/resteasy-reactive/rest-kotlin-serialization-common/runtime/src/main/kotlin/io/quarkus/resteasy/reactive/kotlin/serialization/common/runtime/JsonProducer.kt#L42-L78","documentation":"JsonProducer configures kotlinx.serialization Json naming strategies reflectively by setting the `namingStrategy` property on JsonBuilder. If the kotlinx.serialization version in use no longer exposes that mutable property (API change), the lookup returns null and a ReflectiveOperationException is thrown. This is a library-version compatibility failure, typically surfaced indirectly as IllegalArgumentException wrapping.","triggerScenarios":"Setting quarkus.kotlin-serialization.json.naming-strategy at build/runtime time with a kotlinx-serialization version whose JsonBuilder lacks the namingStrategy property, or where it is not a KMutableProperty1.","commonSituations":"Upgrading or downgrading kotlinx-serialization-json so its internal JsonBuilder API differs from what the Quarkus rest-kotlin-serialization-common extension expects; Quarkus/kotlinx version skew in a project BOM.","solutions":["Align kotlinx-serialization-json version with the one supported by your Quarkus version (check the Quarkus BOM)","Construct the Json instance manually with Json { namingStrategy = ... } instead of relying on the CDI producer if versions cannot be aligned","Upgrade Quarkus to a version compatible with your kotlinx-serialization version","Remove the naming-strategy config to fall back to the default Json instance"],"exampleFix":"// before (config-driven, version-dependent)\nquarkus.kotlin-serialization.json.naming-strategy=io.ktor...JsonNamingStrategy.SnakeCase\n// after (explicit)\nval json = Json { namingStrategy = JsonNamingStrategy.SnakeCase }","handlingStrategy":"validation","validationCode":"// Verify kotlinx-serialization exposes the property before configuring\nval hasNamingStrategy = JsonBuilder::class.memberProperties.any { it.name == \"namingStrategy\" }\nrequire(hasNamingStrategy) { \"kotlinx-serialization version incompatible with naming-strategy config\" }","typeGuard":"fun JsonBuilder.hasNamingStrategy(): Boolean =\n    JsonBuilder::class.memberProperties.any { it.name == \"namingStrategy\" }","tryCatchPattern":"try {\n    json = produceJson()\n} catch (e: ReflectiveOperationException) {\n    json = Json.Default // fall back to default Json\n}","preventionTips":["Align kotlinx-serialization-json with the Quarkus BOM version","Prefer building Json explicitly over reflection-based config when possible","Test naming-strategy config in CI after any dependency upgrade"],"tags":["kotlin","kotlinx-serialization","reflection","version-compatibility","json"],"backgroundTag":"reflective-api-missing","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}