mybatis报错could not be found for the javaType

Posted Victor _Lv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis报错could not be found for the javaType相关的知识,希望对你有一定的参考价值。

一、报错栈:

Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property '__frch_recordId_0'. It was either not specified and/or could not be found for the javaType (com.xxx.RelUser) : jdbcType (null) combination.
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
	at com.sun.proxy.$Proxy95.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
	at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
	at com.sun.proxy.$Proxy460.pagingQueryShareRecord(Unknown Source)

二、原因:

先说这个报错直接原因:是因为 Mybatis 将对象绑定到 mapper sql 的元素时,出现了 javaType 和 jdbcType 丙丁(映射)失败的问题。
具体分析:

Mybatis mapper xml 写法如下:

<where>
            <if test="recordIdList != null and !recordIdList.isEmpty()">
                id IN
                <foreach collection="recordIdList" item="recordId" open="(" separator="," close=")">
                    #{recordId}
                </foreach>
            </if>
            ...
</where>

其中 recordIdList 是一个 List<Integer>
翻这个接口调用栈源码,一直没看出来啥问题,除了最上层函数,下层函数每一个单元测试都没问题。
后来断点打在最上层函数的入参,发现了原因,原来是运行时传参的问题。recordIdList 是前置一个 sql 抛出来的结果集,这个前置 SQL 的方法返回值我也定义成 List<Integer>,没毛病,但是 mapper 里边用了 resultmap = RelUser,导致返回实际是一个 List<RelUser> 这样的形式,方法定义接收是 List<Integer>,实际 return 是List<RelUser> 为什么不报错?那是因为 Mybatis 是照着 resultMap / resultType 来填充 List 的,然后把对象的引用(指针) 挂到函数的返回上,因为是直接挂指针了,没有强制转换/参数校验,所以并不会报错。但是拿 List<RelUser> 再到下一句 sql 挂成 List<Integer>,那 Mybatis 的 <foreach collection="recordIdList" item="recordId" 就会绑定失败。

三、解决办法:
把第一句 sql resultMap 改成 resultType="Integer" 即可解决。

以上是关于mybatis报错could not be found for the javaType的主要内容,如果未能解决你的问题,请参考以下文章

mybatis报错could not be found for the javaType

springboot 报错Field XXX required a bean of type XXX that could not be found.

Unity导入图片报错File could not be read

Unity导入图片报错File could not be read

Unity导入图片报错File could not be read

The following artifacts could not be resolved(jenkins打包报错)