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

昨天在做毕设进行一对多插入的时候

出现了500错误

先看代码

mapper层代码

这里我是list集合进行一对多插入

控制层

前端

 页面展示

然后页面显示500错误

 查看控制台

  报错:No primary or single unique constructor found for interface java.util.List
    at org.springframework.beans.BeanUtils.getResolvableConstructor

request失败

    因为获取controller参数是在进入controller方法之前(因为需要转换成controller需要的参数),所以肯定是在获取controller参数之前。
那是处理器映射过程中的问题。
处理器映射需要将请求路径与@RequestMapping 匹配。看来这个过程还需要映射参数。

Spring MVC获取参数不带注解的唯一要求就是参数名和Http请求参数名一致。一般的 List 参数只是用逗号分隔。不会有所谓的名字,所以才有可能。这是结果。
 

 最后插入数据成功

 

参考文章:Spring MVC passed List type parameter error: No primary or default constructor found for interface java.util.List] Use two annotations to solve - Krybot

 

 

### 解决Java `List` 接口无主构造函数或单一唯一构造函数问题 在 Java 中,`List` 是一个接口而不是具体的实现类,因此不存在所谓的“主构造函数”。为了创建 `List` 的实例并对其进行操作,通常有几种常见的方式。 #### 使用具体实现类的构造函数 可以直接使用实现了 `List` 接口的具体类来创建对象。例如: ```java // 创建 ArrayList 实例 ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("Element"); ``` 这种方式通过调用特定实现类(如 `ArrayList` 或 `LinkedList`)的构造函数来初始化列表[^1]。 #### 利用静态工厂方法 自 Java 9 起引入了集合不可变工厂方法,允许更加简洁地创建固定大小且不可修改的列表: ```java // 创建不可变 List List<String> immutableList = List.of("One", "Two", "Three"); ``` 对于可变长度的需求,则可以考虑使用 `Arrays.asList()` 方法返回一个受支持的列表视图: ```java // 返回由指定数组支持的固定大小列表 List<String> fixedSizeList = Arrays.asList(new String[]{"A", "B", "C"}); ``` 需要注意的是,上述两种方式产生的列表具有不同的特性,在选择时应考虑到实际应用场景的要求[^2]。 #### 结合 Lambda 表达式与流 API 进行复杂数据处理 当涉及到较为复杂的初始化逻辑时,还可以借助于 Stream API 和 Lambda 表达式的组合来进行高效的数据转换和过滤: ```java import java.util.stream.Collectors; import java.util.Arrays; public class Example { public static void main(String[] args) { // 将整数范围映射成字符串列表 List<String> stringNumbers = IntStream.rangeClosed(1, 5) .mapToObj(Integer::toString) .collect(Collectors.toList()); System.out.println(stringNumbers); } } ``` 这段代码展示了如何利用流管道操作快速构建满足条件的新列表[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值