Welcome everyone

No constructor found in …. matching…. 报错

java 汪明鑫 714浏览 0评论

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异常,即未找到合适的构造方法。

转载请注明:汪明鑫的个人博客 » No constructor found in …. matching…. 报错

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz