Spring Boot矩阵变量提取时触发ClassCastException问题咨询
这个问题的核心在于Java泛型擦除和Spring MVC参数绑定的机制:
泛型擦除导致运行时丢失类型信息
你声明的Map<String, List<Integer>>在编译后,JVM会擦除泛型参数,运行时只能识别出这是一个Map,其中的值是List,但不知道List的泛型是Integer。Spring MVC在处理矩阵变量时,只能基于运行时的类型信息来绑定参数,所以它会把URL中提取到的字符串类型的矩阵变量值,直接存入List<Object>中,而不是自动转换为Integer。矩阵变量的原始类型是字符串
矩阵变量是从URL中解析出来的,所有参数的原始类型都是字符串。Spring MVC默认不会对泛型集合中的元素做自动类型转换——它只会处理顶层的参数类型转换(比如直接接收Integer类型的单个矩阵变量),但对于嵌套在Map或List里的泛型参数,不会主动遍历并转换元素类型。手动转换可行的原因
你手动把元素转为Integer能正常运行,是因为矩阵变量的字符串值本身是可以转换为整数的(比如"100"转成Integer没问题),但Spring并没有自动帮你做这一步转换,所以直接强转Integer时,JVM发现实际类型是String,就会抛出ClassCastException。
如果想要避免手动转换,可以自定义Converter或者利用Spring的ConversionService来处理集合元素的类型转换,或者先接收Map<String, List<String>>再自行转换为Integer类型的集合。
内容的提问来源于stack exchange,提问作者Sandeep Shiven

