spring-boot - 逗号分隔的请求参数不适用于 Kotlin 数据类
问题描述
我有一个可以接受数十个请求参数的端点。在数据类中收集所有这些参数会很好。此外,请求参数必须用逗号分隔
path?param=1,2
以保持向后兼容性。假设我们有这个端点:
@GetMapping("path")
fun someFun(@RequestParam param: Set<Int> = emptySet()
...other 11 params
)
我创建了一个数据类来收集所有请求参数:
data class ClusteredParams(val param: Set<Int> = emptySet()
...other 11 params
)
因此端点如下所示:
@GetMapping("path")
fun someFun(param: ClusteredParams)
当我打电话时,path?param=1,2
我得到:
“错误”:“无法将 java.lang.String[] 类型的值转换为所需的 java.util.Set 类型;嵌套异常是 java.lang.NumberFormatException:对于输入字符串:“1,2”、“field” :“参数”,“rejectedValue”:“1,2”
当我打电话时,path?param=1¶m=2
一切都很好。当 ClusteredParams 类用 Java 编写时,这个问题就不存在了。
public class ClusteredParams {
private Set<Int> param;
...other 11 params
getters and setters
}
解决方案
我不知道答案,但我做了比较什么有效,什么时候有效:
在 Java 中:
您可以调用?path=1,2
,?path=1&path=2
无论您的请求参数是使用@RequestParam path: List<Int>
控制器方法的内部签名声明的,还是它是用于对控制器方法的所有请求参数进行分组的外部对象的字段。
在科特林:
如果您在控制器方法签名中声明您的请求参数,作为 a@RequestParam path: List<Int>
或其他任何内容,您可以使用这两种方法调用它,所以:
?path=1,2 和 ?path=1&path=2
但是,如果您将其提取到单独的数据类中,然后期望将此类填充到控制器方法中,则只能执行 ?path=1&path=2,因为在 ?path=1,2 的情况下,您会得到:
org.springframework.validation.BindException 因为它尝试解析整个 '1,2' 而不是先拆分它。
我希望现在更清楚了,有人知道为什么会这样吗?
推荐阅读
- excel - 将单元格的文本存储在字符串变量 VBA 中
- javascript - 如何在 React 和 Typescript 中使用 useRef 钩子和 getClientBoundingRect?
- javascript - 我如何修复我的代码以将每个段落放在一个新行中,因为我试图在给定段落之前添加段落
- php - 需要具有不同主题相同数据库的重复 Drupal 7 站点,有什么建议吗?
- javascript - 在没有 Webpack/Bundlers 的 PHP 中镜像 Vue 组件
- php - PHP调试mysqli连接,mysqli实例不能正常工作?
- python - 在一个非常大的数据集中找到一个不同长度的数组中的先前值,以提高内存效率,而它目前无法完成
- powershell - Skip Drive during Powershell Iteration
- sql - 如何根据列的累积总和创建不相等的十分位数/四分位数
- reactjs - SharePoint 框架 creatRef 对象未定义