文章目录
1. 复现错误2. 分析错误3. 解决错误4. 文末补充
1. 复现错误
今天写好导入hive表的回调接口,如下代码所示:
/** * hive表导入的回调接口 * * @author super先生 * @datetime 2023/3/20:16:32 * @return */@ResponseBody@PostMapping(value = "/xxx/callback")public ServiceStatusData callbackLocalHiveImportTables(@RequestParam("missionId") String missionId) { logger.info("mock数据的入参记录:missionId={}", missionId); if (isBlank(missionId)) { return new ServiceStatusData(ServiceStatusData.Status.Fail, "入参错误:缺少任务id", null); } return hiveImportTaskService.queryByMissionId(missionId);} 启动项目,使用postman测试,却报出如下错误:

即nested exception is org.apache.ibatis.binding.BindingException: Parameter 'queryByMissionId' not found. Available parameters are [missionId, param1]。
2. 分析错误
将错误信息nested exception is org.apache.ibatis.binding.BindingException: Parameter 'queryByMissionId' not found. Available parameters are [missionId, param1]翻译成中文就是未找到queryByMissionId参数,参数可能是missionId。
根据错误信息ibatis.binding.BindingException可知,这是mybatis框架报出的错误。
由此,可以断定问题可能出在Mapper类中,即我的HiveImportTaskMapper.java类,如下代码所示:
/*** @author super先生* @datetime 2023/3/21 16:25* @desc*/@Mapper@Repositorypublic interface HiveImportTaskMapper { /** * 根据任务逻辑id查询任务 * * @author super先生 * @datetime 2023/3/23:13:47 * @param missionId 任务逻辑id * @return */ HiveImportTask queryByMissionId(@Param("missionId") String missionId);} 由上可知,我的HiveImportTaskMapper.java类没有问题。
那么,问题可能出在hiveImportTaskMapper.xml中,如下代码所示:
<select id="queryByMissionId" parameterType="java.lang.String" resultType="com.xxx.HiveImportTask">SELECTid AS id,mission_id AS missionId,dataset_id AS datasetId,request_config AS requestConfig,mission_state AS missionState,user_id AS userId,create_time AS createTime,update_time AS updateTime,deleted,import_result AS importResultFROMhive_import_taskWHEREdeleted = 0AND mission_id = #{queryByMissionId}ORDER BYcreate_time DESCLIMIT 1 FOR UPDATE </select> HiveImportTaskMapper.java类对比hiveImportTaskMapper.xml发现:
在HiveImportTaskMapper.java类中的queryByMissionId方法中的@Param注解参数是missionId,
hiveImportTaskMapper.xml配置文件的id="queryByMissionId"中的占位符参数是queryByMissionId,即mission_id = #{queryByMissionId}。
因而可知,queryByMissionId在HiveImportTaskMapper.java类和hiveImportTaskMapper.xml配置文件中的参数名称不一样导致的,如下图所示:

3. 解决错误
既然是queryByMissionId在HiveImportTaskMapper.java类和hiveImportTaskMapper.xml配置文件中的参数名称不一样导致该错误,那么,让queryByMissionId在这两个文件中参数名称一致即可,可以有如下两种解决方法:
hiveImportTaskMapper.xml配置文件中的占位符名称,使其和HiveImportTaskMapper.java类中@param注解参数一致,如下图所示: 
如此修改后,重新启动项目,再次使用postman测试,即可成功调用接口,如下图所示:

HiveImportTaskMapper.java类中@param注解参数,使其和hiveImportTaskMapper.xml配置文件中的占位符保持一致,如下图所示: 
如此修改后,重新启动项目,再次使用postman测试,也可成功调用接口,如下图所示:

4. 文末补充
通过对错误nested exception is org.apache.ibatis.binding.BindingException: Parameter 'queryByMissionId' not found. Available parameters are [missionId, param1]的分析与解决得出如下结论:
但凡报出nested exception is org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found此类错误,一般都是xxxMapper.java类中的方法形参名称和xxxMapper.xml配置文件中的占位符名称不一致导致的,可以有如下两种解决方法:
修改xxxMapper.xml配置文件中的占位符名称,使其和xxxMapper.java类中@param注解参数一致。
修改xxxMapper.java类中@param注解参数,使其和xxxMapper.xml配置文件中的占位符保持一致。
此处解释@Param注解的作用,当我们的sql中需要多个参数时。Maybatis会将参数列表中的参数封装成一个Map进行传递,这个过程是通过@Param来实现的。
@Param注解括号中的值会作为key,value就是参数实际的值。
解析参数的时候会按照@Param中定义的key获取对应的值,如下代码所示:
void insertNewAdminRelationship(@Param("adminId") Integer adminId, @Param("roleIdList") List<Integer> roleIdList); 这样MyBayis传递的是就是一个{"adminId":adminId,"roleIdList":roleIdList}的形式,当sql运行的时候取值的方式就是通过get("roleIdList")来获取值的。