返回

传递List类型参数报错 No primary or single unique constructor found for interface java.util.List 解决办法

后端

Spring Boot 传递 List 类型参数的常见错误

问题:

您可能在使用 Spring Boot 开发 Web 应用程序时遇到以下错误:

No primary or single unique constructor found for interface java.util.List

错误原因:

这个错误的出现是因为 Spring MVC 在处理控制器参数时,需要找到与请求参数类型相匹配的构造函数。而 List 接口本身没有这样的构造函数,因此 Spring MVC 无法找到与请求参数类型相匹配的构造函数,从而抛出错误。

解决方法:

要解决这个错误,您需要为 List 类型参数提供一个明确的构造函数。这可以通过以下几种方法实现:

1. 在 List 类型参数的声明中指定构造函数:

@RequestMapping(value = "/api/v1/users", method = RequestMethod.POST)
public ResponseEntity<List<User>> createUsers(@RequestBody List<User> users) {
    // ...
}

2. 在 List 类型参数的旁边添加一个 @RequestParam 注解:

@RequestMapping(value = "/api/v1/users", method = RequestMethod.POST)
public ResponseEntity<List<User>> createUsers(@RequestParam List<User> users) {
    // ...
}

3. 在 List 类型参数的旁边添加一个 @RequestBody 注解:

@RequestMapping(value = "/api/v1/users", method = RequestMethod.POST)
public ResponseEntity<List<User>> createUsers(@RequestBody List<User> users) {
    // ...
}

通过以上方法之一,您可以为 List 类型参数提供一个明确的构造函数,从而解决错误。

代码示例:

以下是使用 @RequestBody 注解解决错误的代码示例:

@RequestMapping(value = "/api/v1/users", method = RequestMethod.POST)
public ResponseEntity<List<User>> createUsers(@RequestBody List<User> users) {
    // ...
}

其他技巧:

  • 确保 List 类型参数的泛型类型与请求参数类型匹配。
  • 尝试使用 @ModelAttribute 注解,它可以帮助 Spring MVC 找到与请求参数类型相匹配的构造函数。

常见问题解答:

1. 为什么 List 接口没有构造函数?

List 接口是一个接口,而不是一个类。接口不包含实现细节,因此不包含构造函数。

2. 如何确定正确的构造函数?

Spring MVC 会尝试寻找与请求参数类型相匹配的泛型类型的构造函数。例如,如果您要传递一个 List 参数,Spring MVC 将会寻找一个具有 List 泛型类型的构造函数。

3. 为什么 @RequestParam 注解可以解决错误?

@RequestParam 注解允许您指定请求参数的名称。Spring MVC 将使用此名称来查找与请求参数类型相匹配的构造函数。

4. 为什么 @RequestBody 注解可以解决错误?

@RequestBody 注解指示 Spring MVC 将请求主体解析为 List 对象。Spring MVC 将使用此解析后的对象来调用控制器方法。

5. 为什么使用 @ModelAttribute 注解可以解决错误?

@ModelAttribute 注解允许您指定模型属性的名称。Spring MVC 将使用此名称来查找与请求参数类型相匹配的构造函数。