通过spring-boot@RequestParam在Kotlin中创建映射时,键入不起作用



我使用的是spring-boot,并制作了以下控制器,在其中明确指定键和值类型。

@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%确定,但我的猜测是,这是因为泛型类型擦除。

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

根据文档,当没有提供参数名称时,@RequestParam可以返回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()
}

相关内容

  • 没有找到相关文章

最新更新