“No primary or single unique constructor found for interface java.util.List”问题原因及解决

问题原因:

这个错误通常出现在使用 MyBatis 查询结果映射时,MyBatis 无法找到适合的构造方法来将查询结果转换为指定的 Java 对象。具体来说,错误信息 "No primary or single unique constructor found for interface java.util.List" 意味着 MyBatis 在将查询结果转换为 List 类型对象时遇到了问题,因为它无法找到一个合适的构造方法来实例化 List 对象。

而导致这些问题有以下几种原因:

  1. 错误的映射类型: 在 MyBatis 的映射文件中,可能将结果集映射为了 java.util.List 类型,但实际上 MyBatis 不能直接将结果集映射为 List 类型,因为 List 是一个接口,不能直接实例化。解决方法是将映射类型改为一个具体的 Java 类型,例如 com.yourpackage.YourEntityClass

  2. 缺少合适的构造方法: 如果实体类(例如 YourEntityClass)没有提供无参构造方法,同时 MyBatis 也无法找到合适的构造方法来匹配查询结果的列,就会出现这个错误。

  3. 构造方法参数匹配问题: 如果实体类中的构造方法参数和查询结果的列不匹配,也会导致这个错误。请确保实体类的构造方法参数顺序和类型与查询结果的列一一对应。

  4. 自定义结果映射问题: 如果使用了自定义的结果映射(ResultMap),请确保配置正确,并且没有产生冲突。

解决方法:
  • 确认 MyBatis 映射文件中的结果映射配置是否正确,特别是对应实体类是否正确。
  • 确认实体类是否提供了无参构造方法,并且构造方法参数是否正确匹配查询结果的列。
  • 确认查询的 SQL 语句是否正确,列名是否和实体类的属性名匹配。

本人解决的步骤:

以上是网上搜集的一些解决办法,而我在经过问题排查后发现是因为自己在mapper层为加@PathVariable注解。

 不添加该注解导致错误的原因:

@PathVariable注解的作用在Controller层的方法中,参数注解 @PathVariable 用于将URL路径中的变量提取出来,并绑定到方法的参数上。它告诉Spring MVC框架该参数值应该从URL路径中获取,而不是从请求的请求体(Request Body)中获取。

        当在Controller层的方法参数上使用 @PathVariable 注解时,Spring MVC会尝试根据URL路径的占位符名称来匹配方法参数的名称,从而将URL路径中的变量值传递给方法参数。如果在使用 @PathVariable 注解时,没有在方法参数上添加该注解,Spring MVC将无法正确识别URL路径中的变量,从而导致找不到匹配的方法签名,进而报错 "No primary or single unique constructor found for interface java.util.List"。

        举个例子,这里我有一个URL路径 /delete/1,2,3,其中 1,2,3 是要删除的ids。在Controller层的方法中,如果没有使用 @PathVariable 注解,Spring MVC会默认从请求体中获取参数,但请求体中并没有ids参数,所以就会报错找不到匹配的方法签名。

        使用 @PathVariable 注解时,要确保注解的参数名与URL路径中的占位符名称一致,这样Spring MVC才能正确地将URL路径中的变量传递给方法参数。