首页 > 解决方案 > Spring 如何将查询参数反序列化为 Kotlin 数据类?

问题描述

假设一个 Spring@RestController带有一个简单@GetMapping的接受一个VenueQuery数据类作为它的参数:


data class VenueQuery(
    val cityId: Long? = null,
    val countryIso: String? = null,
)

@RestController
open class VenueController {

    @GetMapping("/venues")
    open fun getVenues(
        request: HttpServletRequest,
        response: HttpServletResponse,
        venueQuery: VenueQuery
    ) { ... }
}

运行上面的代码,工作“很好”。GET /venues?cityId=1&countryIso=CZ反序列化为VenueQuery(cityId=1, countryIso="CZ"}.

但是,使用 注释venueQuery 函数参数@RequestParam会导致使用 拒绝相同的请求BAD_REQUEST "Missing required parameter 'venueQuery'"。这是有道理的,但会使前一种情况更加混乱。

经过一段时间的搜索,我仍然无法回答以下问题:

  1. 在哪里可以找到更详细地描述此行为的文档?即我可以指出的任何参考,而不是依赖一次性观察?
  2. 第一种情况甚至是预期的行为吗?
  3. spring 如何知道它应该venueQuery使用查询参数而不是requestand参数填充response参数?它是否通过其 servlet 请求/响应的类型来推断?
  4. 一般来说,我很难找到关于 Spring 注释和原则如何在 Kotlin 中应用的任何文档(不是“如何”而是文档)。有什么值得注意的来源吗?

感谢您的任何回答!

标签: springkotlin

解决方案


  1. 预期的行为?

是的。

  1. spring 如何知道它应该用查询参数填充venueQuery 参数?

按其类型。尝试两个,VenueQuery看看会发生什么。

  1. 一般来说,我很难找到任何文件......

除非行为明显不同,否则没有特别提到 Kotlin。至于“显着来源”,我总是在他们的源代码中找到我正在寻找的答案。喝杯咖啡,启动调试器,你也会的。


推荐阅读