nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法
作者:mmseoamin日期:2024-01-25

文章目录

  • 1. 复现错误
  • 2. 分析错误
  • 3. 解决错误

    1. 复现错误

    今天写好hive表导入的回调的接口,如下代码所示

    /**
     * hive表导入的回调接口
     *
     * @author super先生
     * @datetime 2023/3/20:16:32
     * @return
     */
    @ResponseBody
    @PostMapping(value = "/xxx/importTables/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.callbackLocalHiveImportTables(missionId);
    }
    

    启动postman访问该接口,确报出如下错误:

    nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法,在这里插入图片描述,第1张

    即nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='missionId', mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}

    2. 分析错误

    根据nested exception is org.apache.ibatis.type.TypeExceptio可知,这是mybatis的类型异常错误。

    其次,再将错误信息Could not set parameters for mapping: ParameterMapping...,翻译成中文无法设置映射的参数:参数映射。

    ParameterMapping清晰的toString的代码如下所示:

    {
    	property='missionId',
     	mode=IN, 
     	javaType=class java.lang.Long, 
     	jdbcType=null, 
     	numericScale=null, 
     	resultMapId='null', 
     	jdbcTypeName='null', 
     	expression='null'
    }
    

    属性(property)为missionId,类型(javaType)为java.lang.Long,但为什么无法设置映射的参数呢?

    首先经过打断点的方式,来定位错误之处,如下代码所示:

    nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法,在这里插入图片描述,第2张

    由断点可以初步判断,问题可能出现在hiveImportTaskMapper.updateCallbackTimeByMissionId(missionId);方法中,继续断点往下走:

    nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法,在这里插入图片描述,第3张

    由此可以确定,问题出现在hiveImportTaskMapper.updateCallbackTimeByMissionId(missionId);方法中。

    于是,进入到hiveImportTaskMapper.updateCallbackTimeByMissionId(missionId)方法,如下代码所示:

    @Mapper
    @Repository
    public interface HiveImportTaskMapper {
    	/**
    	 * 更新回调时间
    	 *
    	 * @author super先生
    	 * @datetime 2023/3/24:11:45
    	 * @param missionId 抽取逻辑id
    	 * @return
    	 */
    	Long updateCallbackTimeByMissionId(String missionId);
    }
    

    接着进入到hiveImportTaskMapper.xml文件中,找到id = updateCallbackTimeByMissionId的update标签,如下代码所示:

    
        UPDATE 
            hive_import_task 
        SET 
            call_back_time = NOW() , 
            update_time = NOW() 
        where 
            deleted = 0 and mission_id = #{missionId}
    
    

    可以清晰地看到:

    1. HiveImportTaskMapper类中的updateCallbackTimeByMissionId(missionId);方法的形参是String类型

    2. hiveImportTaskMapper.xml文件中的parameterType是Long类型。

    nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法,在这里插入图片描述,第4张

    因而,类型不一致才说无法设置映射的参数。

    3. 解决错误

    既然是 HiveImportTaskMapper类中的updateCallbackTimeByMissionId(missionId);方法的形参类型和hiveImportTaskMapper.xml文件中的parameterType类型不一致,导致了这个错误,可进行如下修改。

    将hiveImportTaskMapper.xml文件中的parameterType类型,修改为java.lang.String即可,如下代码所示:

    
        UPDATE
            hive_import_task
        SET
            call_back_time = NOW() ,
            update_time = NOW()
        where
            deleted = 0 and mission_id = #{missionId}
    
    

    nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法,在这里插入图片描述,第5张

    重新启动项目,再次使用postman测试,方可成功运行,如下图所示:

    nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping错误的决方法,在这里插入图片描述,第6张