问题原因:
这个错误通常出现在使用 MyBatis 查询结果映射时,MyBatis 无法找到适合的构造方法来将查询结果转换为指定的 Java 对象。具体来说,错误信息 "No primary or single unique constructor found for interface java.util.List" 意味着 MyBatis 在将查询结果转换为 List 类型对象时遇到了问题,因为它无法找到一个合适的构造方法来实例化 List 对象。
而导致这些问题有以下几种原因:
-
错误的映射类型: 在 MyBatis 的映射文件中,可能将结果集映射为了
java.util.List
类型,但实际上 MyBatis 不能直接将结果集映射为 List 类型,因为 List 是一个接口,不能直接实例化。解决方法是将映射类型改为一个具体的 Java 类型,例如com.yourpackage.YourEntityClass
。 -
缺少合适的构造方法: 如果实体类(例如
YourEntityClass
)没有提供无参构造方法,同时 MyBatis 也无法找到合适的构造方法来匹配查询结果的列,就会出现这个错误。 -
构造方法参数匹配问题: 如果实体类中的构造方法参数和查询结果的列不匹配,也会导致这个错误。请确保实体类的构造方法参数顺序和类型与查询结果的列一一对应。
-
自定义结果映射问题: 如果使用了自定义的结果映射(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路径中的变量传递给方法参数。
来源地址:https://blog.csdn.net/LuoluoluoluoYan/article/details/132065315