Cause: org.apache.ibatis.type.TypeException: Error setting non null for xxx with JdbcType错误的详细解决方法

  • Post author:
  • Post category:其他




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

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

在这里插入图片描述



Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null



2. 分析错误


根据

org.apache.ibatis.type.TypeException

可知,这是

mybatis

的类型异常错误。

其次,再将错误信息

Error setting non null for parameter #1 with JdbcType null

,翻译成中文

使用 JdbcType null 为参数 #1 设置非空时出错


参数 #1 (parameter #1

)是指上图中的

missionId

,为什么设置非空时出错呢?

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

在这里插入图片描述

由断点可以初步判断,问题可能出现在

hiveImportTaskMapper.updateCallbackTimeByMissionId(missionId);

方法中,继续断点往下走:

在这里插入图片描述

由此可以确定,问题出现在

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 id="updateCallbackTimeByMissionId" parameterType="java.lang.Long">
    UPDATE 
        hive_import_task 
    SET 
        call_back_time = NOW() , 
        update_time = NOW() 
    where 
        deleted = 0 and mission_id = #{missionId}
</update>

可以清晰地看到:


  1. HiveImportTaskMapper

    类中的

    updateCallbackTimeByMissionId(missionId);

    方法的形参是

    String

    类型


  2. hiveImportTaskMapper.xml

    文件中的

    parameterType



    Long

    类型。

在这里插入图片描述

因而,类型不一致才报出了这个错误。



3. 解决错误


既然是

HiveImportTaskMapper

类中的

updateCallbackTimeByMissionId(missionId);

方法的形参类型和

hiveImportTaskMapper.xml

文件中的

parameterType

类型不一致,导致了这个错误,可进行如下修改。



hiveImportTaskMapper.xml

文件中的

parameterType

类型,修改为

java.lang.String

即可,如下代码所示:

<update id="updateCallbackTimeByMissionId" parameterType="java.lang.String">
    UPDATE
        hive_import_task
    SET
        call_back_time = NOW() ,
        update_time = NOW()
    where
        deleted = 0 and mission_id = #{missionId}
</update>

在这里插入图片描述

重新启动项目,再次使用

postman

测试,方可成功运行,如下图所示:

在这里插入图片描述



版权声明:本文为lvoelife原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。