mybatis报错
No constructor found in …. matching….
查询数据库返回一个实体类的list
最开始方向走错了,以为是数据库数据类型映射到Java数据类型出错,接收不到
后来发现是由于构造函数的问题,需要提供有参构造函数和无参构造函数,加上就不报错了
这是mybatis源码层面决定的,细节的代码看不懂
到后面是调用
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#createByConstructorSignature
把从数据库中查出来的结果集,通过构造函数的方式实例化
private Object createByConstructorSignature(ResultSetWrapper rsw, Class<?> resultType, List<Class<?>> constructorArgTypes, List<Object> constructorArgs,
String columnPrefix) throws SQLException {
final Constructor<?>[] constructors = resultType.getDeclaredConstructors();
final Constructor<?> annotatedConstructor = findAnnotatedConstructor(constructors);
if (annotatedConstructor != null) {
return createUsingConstructor(rsw, resultType, constructorArgTypes, constructorArgs, columnPrefix, annotatedConstructor);
} else {
for (Constructor<?> constructor : constructors) {
if (allowedConstructor(constructor, rsw.getClassNames())) {
return createUsingConstructor(rsw, resultType, constructorArgTypes, constructorArgs, columnPrefix, constructor);
}
}
}
throw new ExecutorException("No constructor found in " + resultType.getName() + " matching " + rsw.getClassNames());
}
我们能够找到这个异常的源头了,找不到合适的构造函数就会抱这个异常
执行查询语句映射查询结果到Java Bean时,会根据resultMap配置和映射类的定义来解析为具体的对象,并根据以下几种条件进行解析。
- resultMap的子元素配置typeHandler
- resultMap包含constructor元素
- 映射类为接口或定义无参构造方法,也就是默认构造方法
- 映射类定义有参构造方法
- 开启自动映射
如不满足以上几种情况则会抛出ExecutorException
异常,一般来说,我们在开发中通过调用无参构造方法的方式来创建结果实例,但是如果定义了有参构造方法,那情况就有所不同了。映射类定义有参构造方法之后,Mybatis会按照映射类定义有参构造方法
的方式进行解析,这时它会把result
映射的全部结果作为构造方法的参数来创建实例,也就是说映射字段和构造方法参数必须一致,如不一致则抛出ExecutorException
异常,即未找到合适的构造方法。
说点什么
您将是第一位评论人!