{"record":{"id":"2e601c7bdbc5dabe","repo":"quarkusio/quarkus","slug":"error-loading-naming-strategy-strategy-substri","errorCode":null,"errorMessage":"Error loading naming strategy:  ${strategy.substringAfter('.')}","messagePattern":"Error loading naming strategy:  (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","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":89,"sourceCode":"                jsonProducer.loadStrategyClass(strategy)\n            },\n        )\n    }\n\n    @ExperimentalSerializationApi\n    private fun loadStrategyClass(strategy: String): JsonNamingStrategy {\n        try {\n            val strategyClass: Class<JsonNamingStrategy> =\n                Thread.currentThread().contextClassLoader.loadClass(strategy)\n                    as Class<JsonNamingStrategy>\n            val constructor =\n                strategyClass.constructors.find { it.parameterCount == 0 }\n                    ?: throw ReflectiveOperationException(\n                        \"No no-arg constructor found on $strategy\"\n                    )\n            return constructor.newInstance() as JsonNamingStrategy\n        } catch (e: ReflectiveOperationException) {\n            throw IllegalArgumentException(\n                \"Error loading naming strategy:  ${strategy.substringAfter('.')}\",\n                e,\n            )\n        }\n    }\n\n    @ExperimentalSerializationApi\n    private fun extractBuiltIn(strategy: String): JsonNamingStrategy {\n        val kClass = Builtins::class\n        val property =\n            kClass.memberProperties.find { property ->\n                property.name == strategy.substringAfter('.')\n            }\n                ?: throw IllegalArgumentException(\n                    \"Unknown naming strategy provided:  ${strategy.substringAfter('.')}\"\n                )\n\n        return property.get(JsonNamingStrategy) as JsonNamingStrategy","sourceCodeStart":71,"sourceCodeEnd":107,"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#L71-L107","documentation":"This is thrown by JsonProducer.loadStrategyClass when Quarkus tries to instantiate a user-configured JSON naming strategy class (quarkus.rest.kotlin-serialization.naming-strategy) but loading or constructing it via reflection fails. The underlying ReflectiveOperationException (ClassNotFound, no no-arg constructor, etc.) is wrapped into an IllegalArgumentException naming the strategy's short name.","triggerScenarios":"Setting quarkus.rest.kotlin-serialization.naming-strategy to a fully-qualified custom class name that does not exist on the classpath, is not public, lacks a no-arg constructor, or is not a JsonNamingStrategy.","commonSituations":"Typos in the config value; pointing at a class from a dependency not present at runtime; writing a constructor with args (e.g. to receive config); refactor renamed the strategy class but the property was not updated; native-image builds missing reflection registration.","solutions":["Verify the configured class exists and is on the runtime classpath (check package/name spelling).","Give the class a public no-arg constructor and make it implement kotlinx.serialization.json.JsonNamingStrategy.","If using a built-in strategy, use the Builtins form (e.g. JsonNamingStrategy.Builtins.snake_case) instead of a custom class name.","For native builds, register the class for reflection (@RegisterForReflection)."],"exampleFix":"// before\n@ConfigProperty(name = \"quarkus.rest.kotlin-serialization.naming-strategy\")\n// com.example.MyStrategy (has only a constructor taking a String)\nclass MyStrategy(private val cfg: String) : JsonNamingStrategy { ... }\n// after\nclass MyStrategy : JsonNamingStrategy { ... } // public no-arg ctor","handlingStrategy":"validation","validationCode":"// before configuring\nval klass = runCatching { Class.forName(\"com.example.MyStrategy\") }.getOrNull()\ncheck(klass != null) { \"naming strategy class not on classpath\" }\ncheck(klass.constructors.any { it.parameterCount == 0 }) { \"needs a public no-arg constructor\" }\ncheck(JsonNamingStrategy::class.java.isAssignableFrom(klass))","typeGuard":"fun Class<*>.isValidNamingStrategy() =\n    JsonNamingStrategy::class.java.isAssignableFrom(this) && constructors.any { it.parameterCount == 0 }","tryCatchPattern":null,"preventionTips":["Prefer built-in strategy names over custom classes","Keep strategy classes with public no-arg constructors","Add reflection registration for native builds"],"tags":["kotlin","reflection","config","resteasy-reactive"],"backgroundTag":"class-not-found","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}