异常信息
[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),但实际传入的值是一个字符串类型,导致了类型转换失败。
从异常信息中可以看到以下关键信息:
- "Error setting non null for parameter #1 with JdbcType null":这表明在设置非空参数时发生了错误。
- "java.lang.String cannot be cast to java.lang.Integer":这说明试图将一个字符串转换为整数时发生了类型转换异常。
要解决这个问题,可以通过以下几个步骤来检查和修复:
- 检查 MyBatis 的映射文件(如 XML 文件),确保参数的类型与数据库列的类型匹配。
- 确保传入参数的类型与映射文件中定义的类型一致,如果需要,可以进行相应的类型转换。
- 如果可能的话,尝试指定参数的 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);
}
}