文章目录
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")
来获取值的。