Quarkus+Kotlin使用@PathParam提示无参数值传入怎么解决?
问题原因
- 核心原因是JAX-RS规范要求
@PathParam注解必须显式指定绑定的路径参数名,你当前代码中没有给@PathParam传入参数名属性,运行时框架无法匹配路径上的{userId}和方法参数的对应关系。 - 次要诱因是Kotlin默认编译不会保留方法的参数名元数据,就算你期望框架自动匹配参数名,运行时也拿不到参数的原始名称,只会拿到
arg0、arg1这类占位符名称,自然找不到对应路径参数。
解决方案
- 优先修改注解写法,给
@PathParam显式指定要绑定的路径参数名,修改后代码如下:
@GET @Produces(MediaType.APPLICATION_JSON) @Path("/{userId}") // 给@PathParam传入路径参数名"userId"完成绑定 fun getUser(@PathParam("userId") userId: UUID) : GetUserResponse = try { GetUserSuccess(userRepository.find("id", userId)) } catch (e: NotFoundException) { GetUserFailure(e) }
- 可选优化:如果你不想每次都在注解里写参数名,可以在Kotlin编译配置中开启保留参数名的配置,后续框架可以自动匹配方法参数名和路径参数名:
- Gradle配置(build.gradle.kts):
tasks.withType<KotlinCompile> { kotlinOptions.javaParameters = true }
- Maven配置(pom.xml中kotlin-maven-plugin的configuration节点):
<configuration> <javaParameters>true</javaParameters> </configuration>
- 额外校验点:确认路径参数
{userId}的输入值符合UUID格式,如果传入的字符串无法转换为UUID类型,框架也会抛出参数匹配错误,可根据业务需要添加参数校验逻辑或者自定义类型转换器处理异常。
内容的提问来源于stack exchange,提问作者Ricardo de Vries
相关产品推荐
相关产品推荐

