通过 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()
}
我正在使用 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()
}