【Java Spring MVC项目异常解决】java.lang.String cannot be cast to java.lang.Integer

异常信息

[DEBUG] 2024-04-16 10:28:36,056 org.springframework.jdbc.datasource.DataSourceTransactionManager - Initiating transaction rollback
[DEBUG] 2024-04-16 10:28:36,056 org.springframework.jdbc.datasource.DataSourceTransactionManager - Rolling back JDBC transaction on Connection [com.mysql.jdbc.JDBC4Connection@72a8b18e]
[DEBUG] 2024-04-16 10:28:36,057 org.springframework.jdbc.datasource.DataSourceTransactionManager - Releasing JDBC Connection [com.mysql.jdbc.JDBC4Connection@72a8b18e] after transaction
[DEBUG] 2024-04-16 10:28:36,057 org.springframework.web.servlet.DispatcherServlet - Failed to complete request: java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='delId', mode=IN, javaType=class java.lang.Integer, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

原始代码

Dao层接口:
/**通过proId删除Provider*/
public int deleteProviderById(String delId);


ServiceImpl:
	@Override
	@Transactional(rollbackFor = Exception.class)
	public int deleteProviderById(String delId) {
		try {
			int billCount = billDao.getBillCountByProviderId(delId);
			if (billCount == 0) {
				providerDao.deleteProviderById(delId);
			}
			return billCount;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

异常原因

这个异常的根本原因是在执行数据库操作时,试图将一个字符串类型的值(java.lang.String)转换为一个整数类型(java.lang.Integer),但转换失败了,导致了 ClassCastException 异常。

具体来说,异常信息中提到了 MyBatis,这是一个用于简化 Java 数据持久化层的框架。在 MyBatis 的参数映射过程中,似乎定义了一个参数为整数类型(java.lang.Integer),但实际传入的值是一个字符串类型,导致了类型转换失败。

从异常信息中可以看到以下关键信息:

  1. "Error setting non null for parameter #1 with JdbcType null":这表明在设置非空参数时发生了错误。
  2. "java.lang.String cannot be cast to java.lang.Integer":这说明试图将一个字符串转换为整数时发生了类型转换异常。

要解决这个问题,可以通过以下几个步骤来检查和修复:

  1. 检查 MyBatis 的映射文件(如 XML 文件),确保参数的类型与数据库列的类型匹配。
  2. 确保传入参数的类型与映射文件中定义的类型一致,如果需要,可以进行相应的类型转换。
  3. 如果可能的话,尝试指定参数的 JDBC 类型,避免使用 null 值。

通过对异常信息的分析和以上步骤的检查,应该能够找到并解决这个问题。

修改后代码

	/**通过proId删除Provider*/
	public int deleteProviderById(int delId);


@Override
@Transactional(rollbackFor = Exception.class)
public int deleteProviderById(String delId) {
    try {
       int billCount = billDao.getBillCountByProviderId(delId);
       if (billCount == 0) {
          providerDao.deleteProviderById(Integer.parseInt(delId));
       }
       return billCount;
    } catch (Exception e) {
       throw new RuntimeException(e);
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值