Mybatis逆向工程所生成的mapper接口时出现错误
调用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>
:BaseResultMap
和ResultMapWithBLOBs
)。 -
且其创建的JavaBean中只有无参和全参两种构造器,所以要注意自行添加不带长文本字段的构造器。
作者:bxxiao
链接:https://juejin.im/post/6894194531965763598
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。