通过 spring boot @RequestParam 在 Kotlin 中创建地图时输入不起作用

Typing does not work when creating a map in Kotlin through spring boot @RequestParam

我正在使用 spring 启动并制作了以下控制器,其中我明确指定了键和值类型。

@PostMapping("DAC/set")
    fun setDac(@RequestParam map: HashMap<Int, Float>): ResponseEntity<JSONObject> {
        println(map)
        return dac()
    }

当我发送这样的请求时:

http://localhost:9090/adam6024/DAC/set?a=abc,b=d,d=v

我在控制台中得到这个输出:

{a=abc,b=d,d=v}

为什么我没有收到错误消息?此外,我不能向地图添加字符串值,我的 IDE 不允许我。

我不是 100% 确定,但我的猜测是,这是因为 generic type erasure

基本上,定义为泛型一部分的类型在运行时不再存在。当 Spring 读取请求参数并将它们放入 HashMap 时,类型不再已知,因此不会抛出错误。在运行时,泛型的类型基本上是 HashMap<Object, Object> (Java) / HashMap<Any?, Any?> (Kotlin).

根据 documentation,如果未提供参数名称,@RequestParam 可能 return Map<String, String>MultiValueMap<String, String>

因此,您很可能应该将 @RequestParam 声明为 Map<String, String> 并自行进行任何所需的类型转换。

@PostMapping("DAC/set")
fun setDac(@RequestParam map: Map<String, String>): ResponseEntity<JSONObject> {
    val typedMap = map.entries
        .associate { (key, value) -> key.toInt() to value.toFloat() }
   
    return dac()
}

如果您预先知道参数名称,则可以单独注入它们,在这种情况下 Spring 会为您进行类型转换。

@PostMapping("DAC/set")
fun setDac(@RequestParam(name = "1") first: Float, @RequestParam(name = "2") second: Float): ResponseEntity<JSONObject> {
   // ...
   
   return dac()
}