当前位置:首页 » 《随便一记》 » 正文

nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘xxx‘ not found错误的详细解决方法

12 人参与  2023年04月09日 14:50  分类 : 《随便一记》  评论

点击全文阅读


文章目录

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}

因而可知,queryByMissionIdHiveImportTaskMapper.java类和hiveImportTaskMapper.xml配置文件中的参数名称不一样导致的,如下图所示:

在这里插入图片描述

3. 解决错误


既然是queryByMissionIdHiveImportTaskMapper.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注解括号中的值会作为keyvalue就是参数实际的值。

解析参数的时候会按照@Param中定义的key获取对应的值,如下代码所示:

void insertNewAdminRelationship(@Param("adminId") Integer adminId, @Param("roleIdList") List<Integer> roleIdList);

这样MyBayis传递的是就是一个{"adminId":adminId,"roleIdList":roleIdList}的形式,当sql运行的时候取值的方式就是通过get("roleIdList")来获取值的。


点击全文阅读


本文链接:http://zhangshiyu.com/post/59021.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1