Spring boot 逗号分隔的请求参数不适用于Kotlin数据类

Spring boot 逗号分隔的请求参数不适用于Kotlin数据类,spring-boot,kotlin,Spring Boot,Kotlin,我有一个端点可以接受几十个请求参数。最好在一个数据类中收集所有这些参数。此外,请求参数必须用逗号分隔 path?参数=1,2 保持向后兼容性。 假设我们有这个端点: @GetMapping("path") fun someFun(@RequestParam param: Set<Int> = emptySet() ...other 11 params ) 当我调用path?param=1,2时,我得到: “错误”:“未能将java.lang.String[

我有一个端点可以接受几十个请求参数。最好在一个数据类中收集所有这些参数。此外,请求参数必须用逗号分隔
path?参数=1,2
保持向后兼容性。 假设我们有这个端点:

@GetMapping("path")
fun someFun(@RequestParam param: Set<Int> = emptySet()
   ...other 11 params
)
当我调用path?param=1,2时,我得到:

“错误”:“未能将java.lang.String[]类型的值转换为所需的java.util.Set类型;嵌套异常为java.lang.NumberFormatException:对于输入字符串:“1,2”“, “字段”:“参数”, “拒绝值”:“1,2”

当我调用
path?param=1¶m=2
时,一切正常当使用Java编写ClusteredParams类时,此问题不存在

public class ClusteredParams {
   private Set<Int> param;
   ...other 11 params
   
   getters and setters
}
公共类ClusteredParams{
私有集参数;
…其他11个参数
接球手和接球手
}

我不知道答案,但我比较了什么时候有效:

在Java中:

您可以调用
?path=1,2
?path=1&path=2
,无论您的请求参数是使用控制器方法签名内的
@RequestParam path:List
声明的,还是用于对控制器方法的所有请求参数进行分组的外部对象字段

在科特林:

如果您在控制器方法签名中声明您的请求参数,作为
@RequestParam path:List
或其他任何形式,您可以使用这两种方法调用它,因此:

?路径=1,2和?路径=1和路径=2

但是,如果您将其提取为单独的数据类,然后期望在控制器方法中填充此类,则只能执行?path=1&path=2,因为在?path=1,2的情况下,您会得到:

org.springframework.validation.BindException,因为它试图解析整个“1,2”,而不是首先拆分它


我希望现在更清楚了,有人知道为什么会发生这种情况吗?

而不是
val
在数据类主体中使用
var

data class ClusteredParams(
   ...other 11 params
) {
   var param: Set<Int> = emptySet()
}
数据类ClusteredParams(
…其他11个参数
) {
var param:Set=emptySet()
}

ClusteredParams在Java中是什么样子的?试着用括号括起来
path?param=[1,2]
Try
param=1¶m=2
你们读过这篇文章吗?他需要实现的是path?param=1,2,因为这在Java中是可能的。@SimonMartinelli添加了代码示例
public class ClusteredParams {
   private Set<Int> param;
   ...other 11 params
   
   getters and setters
}
data class ClusteredParams(
   ...other 11 params
) {
   var param: Set<Int> = emptySet()
}