使用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