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

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发现:

  1. HiveImportTaskMapper.java类中的queryByMissionId方法中的@Param注解参数是missionId

  2. hiveImportTaskMapper.xml配置文件的id="queryByMissionId"中的占位符参数是queryByMissionId,即mission_id = #{queryByMissionId}

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

在这里插入图片描述

3. 解决错误


既然是queryByMissionIdHiveImportTaskMapper.java类和hiveImportTaskMapper.xml配置文件中的参数名称不一样导致该错误,那么,让queryByMissionId在这两个文件中参数名称一致即可,可以有如下两种解决方法:

  1. 修改hiveImportTaskMapper.xml配置文件中的占位符名称,使其和HiveImportTaskMapper.java类中@param注解参数一致,如下图所示:

在这里插入图片描述

如此修改后,重新启动项目,再次使用postman测试,即可成功调用接口,如下图所示:

在这里插入图片描述

  1. 修改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配置文件中的占位符名称不一致导致的,可以有如下两种解决方法:

  1. 修改xxxMapper.xml配置文件中的占位符名称,使其和xxxMapper.java类中@param注解参数一致。

  2. 修改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")来获取值的。

猜你喜欢

转载自blog.csdn.net/lvoelife/article/details/129731369