【问题标题】:Comma-delimited request params not working with Kotlin data class逗号分隔的请求参数不适用于 Kotlin 数据类
【发布时间】:2020-11-06 01:01:58
【问题描述】:

我有一个可以接受几十个请求参数的端点。在数据类中收集所有这些参数会很好。此外,请求参数必须用逗号分隔 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 时,我得到了:

"error": "无法将 java.lang.String[] 类型的值转换为所需类型 java.util.Set;嵌套异常是 java.lang.NumberFormatException: 对于输入字符串:"1,2"", “字段”:“参数”, "rejectedValue": "1,2"

当我打电话给path?param=1&amp;param=2 时,一切都很好。 用Java编写ClusteredParams类时不存在此问题

public class ClusteredParams {
   private Set<Int> param;
   ...other 11 params
   
   getters and setters
}

【问题讨论】:

  • ClusteredParams 在 Java 中是什么样子的?
  • 尝试用括号括起来。 path?param=[1,2]
  • 试试param=1&amp;param=2
  • 你们看帖子了吗?他需要实现的是 path?param=1,2 因为这在 Java 中是可能的。
  • @SimonMartinelli 我添加了代码示例

标签: spring-boot kotlin


【解决方案1】:

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

在 Java 中:

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

在 Kotlin 中:

如果你在控制器方法签名中声明你的请求参数,作为 @RequestParam path: List&lt;Int&gt; 或其他任何东西,你可以使用这两种方法调用它,所以:

?path=1,2 和 ?path=1&path=2

如果你将它提取到单独的数据类中,然后期望这个类被填充到控制器方法中,你只能做 ?path=1&path=2,因为在 ?path=1,2 的情况下你会得到:

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

我希望现在更清楚了,有人知道为什么会这样吗?

【讨论】:

    【解决方案2】:

    在数据类主体中使用var代替val

    data class ClusteredParams(
       ...other 11 params
    ) {
       var param: Set<Int> = emptySet()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多