我使用的是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()
}