使用Mybatis逆向工程所生成的mapper接口时出现java.lang.NoSuchMethodException: com…Xxx.(...)异常


调用mybatis的mapper接口中的selectByExample()方法抛出异常:java.lang.NoSuchMethodException: com…Xxx.<init>(...)

搜索网上解决方法大都是在JavaBean中添加无参构造器。但这里并不是缺乏无参构造器。。项目中的mapper.xml、dao接口以及表对应的实体类都是使用Mybatis逆向工程生成,逆向工程生成的JavaBean都有无参构造器。

但报错的原因还是一样:Mybatis在封装结果时,找不到对应JavaBean的指定构造器

最终找到的原因是:

数据表中带有一个text类型的字段(Mysql),mybatis逆向工程针对有长文本字段的表,生成的mapper接口中的select方法有两种类型

List<Bean> selectByExampleWithBLOBs(BeanExample example);
List<Bean> selectByExample(BeanExample example);

即第一个方法返回的数据中会有长文本字段对应的属性值。而第二个不包括长文本。

而我调用的是selectByExample()方法,这时mybatis在封装Bean时会使用反射调用Bean中没有长文本字段的构造器,而逆向工程生成的Bean中只有无参跟全参(包含全部成员变量)两个构造器,所以会抛出上述异常。

解决方法

  • 要使用带有长文本字段的JavaBean时,调用selectByExampleWithBLOBs()方法。
  • 使用selectByExample()方法时,注意在对应JavaBean中添加不包含长文本成员变量的构造器。

小结:

  • 若是数据表中带有长文本字段,在使用Mybatis逆向工程生成的类时要注意mapper方法的select方法有两种类型:返回的JavaBean带长文本字段和不带的(到对应的mapper.xml文件中可以看到封装了两种<resultMap>BaseResultMapResultMapWithBLOBs)。

  • 且其创建的JavaBean中只有无参和全参两种构造器,所以要注意自行添加不带长文本字段的构造器。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM