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
@Repository
public 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">
SELECT
id 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 importResult
FROM
hive_import_task
WHERE
deleted = 0
AND mission_id = #{queryByMissionId}
ORDER BY
create_time DESC
LIMIT 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")
来获取值的。