java.lang.ClassCastException的java类型转换异常解决方案

本文探讨了在使用XStream进行XML字符串到对象转换时遇到的ClassCastException异常问题。异常源于热部署工具devtools导致的类加载器不一致。文中提供了解决方案,即在pom.xml中禁用spring-boot-devtools依赖。

在项目中,需要使用XStream将xml string转成相应的对象,却报出了java.lang.ClassCastException: com.model.test cannot be cast to com.model.test的错误。

原因:

项目中应该是采用了热部署,devtools,因为累加载器的不同所以会导致类型转换失败

措施:

在pom.xml中将以下代码注释掉:

<dependency>
 
    <groupId>org.springframework.boot</groupId>
 
    <artifactId>spring-boot-devtools</artifactId>
 
    <scope>runtime</scope>
 
</dependency>

 

`java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String` 是 Java 中非常常见的类型转换异常。它表示你试图将一个 `Integer` 类型的对象强制转换为 `String` 类型,但这是不允许的,因为它们不是兼容类型。 在 **MyBatis** 框架中,这种错误通常发生在你对结果集的处理或参数传递时类型不匹配,尤其是在使用 `Map`、`ResultMap`、`@MapKey`、`动态 SQL` 等功能时。 --- ## 🔍 常见 MyBatis 报错场景及示例 ### ✅ 场景一:从 `Map` 中取值时类型错误 ```java Map<String, Object> result = sqlSession.selectOne("selectUser", 1); String name = (String) result.get("name"); // ❌ 如果 name 是 Integer 类型就会报错 ``` #### ❌ 错误原因: - 数据库字段 `name` 实际上是 `INT` 类型,而你却强制转换为 `String`。 #### ✅ 正确做法: ```java Object nameObj = result.get("name"); if (nameObj instanceof String) { String name = (String) nameObj; } else if (nameObj instanceof Integer) { String name = nameObj.toString(); // 安全转换 } ``` --- ### ✅ 场景二:MyBatis 映射文件中字段类型不匹配 ```xml <resultMap id="userResultMap" type="User"> <result property="name" column="id"/> <!-- id 是 INT,name 是 String --> </resultMap> ``` #### ❌ 错误原因: - `id` 是数据库中的整型字段,被映射到 Java 的 `String` 属性上,MyBatis 自动赋值时可能会出错(取决于是否使用类型处理器)。 #### ✅ 正确做法: - 修正字段映射,或使用 `TypeHandler` 处理类型转换: ```xml <resultMap id="userResultMap" type="User"> <result property="name" column="name"/> <!-- 正确字段 --> </resultMap> ``` --- ### ✅ 场景三:使用 `@MapKey` 注解时键类型错误 ```java @MapKey("id") // id 是 Integer 类型 Map<String, User> selectUsers(); // 键是 String,实际是 Integer ``` #### ❌ 错误原因: - `@MapKey("id")` 返回的是 `Integer`,但你定义的 Map 键是 `String`,类型不匹配。 #### ✅ 正确做法: ```java @MapKey("id") Map<Integer, User> selectUsers(); // 键为 Integer ``` --- ### ✅ 场景四:动态 SQL 中参数类型不匹配 ```java List<User> getUsers(@Param("id") String id); // 接口定义为 String ``` ```xml <select id="getUsers" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="id.split(',')" item="item" open="(" separator="," close=")"> #{item} </foreach> </select> ``` #### ❌ 错误原因: - `id` 实际是 `Integer`,但被传为 `String`,`split` 会失败或解析出 `Integer` 类型,但你在 SQL 中使用时没有做类型处理。 #### ✅ 正确做法: - 修改接口参数为 `Integer` 或 `String`,确保前后一致: ```java List<User> getUsers(@Param("id") Integer id); ``` --- ### ✅ 场景五:使用 `resultType="map"` 查询时处理不当 ```java Map<String, Object> result = sqlSession.selectOne("selectData"); String value = (String) result.get("value"); // 如果 value 是 Integer 会报错 ``` #### ✅ 正确做法: ```java Object valueObj = result.get("value"); String value = valueObj != null ? valueObj.toString() : null; ``` --- ## 🧪 常见类型转换错误汇总 | 场景 | 报错类型 | 原因 | 建议解决方案 | |------|-----------|------|----------------| | 从 Map 取值错误 | `Integer -> String` | 数据库字段和 Java 属性类型不匹配 | 使用 `instanceof` 判断或 `toString()` | | ResultMap 映射错误 | `Integer -> String` | 映射字段类型不一致 | 检查字段映射或使用 `TypeHandler` | | @MapKey 键类型错误 | `Integer -> String` | 键类型不一致 | 保持 Map 键与 `@MapKey` 返回值类型一致 | | 动态 SQL 参数错误 | `Integer -> String` | 参数传递类型不一致 | 统一接口和 SQL 中参数类型 | | 使用 Map 结果集 | `Integer -> String` | 没有做类型判断 | 使用安全转换或 `toString()` | --- ## ✅ 总结建议 1. **不要直接强制类型转换**,使用 `instanceof` 判断类型。 2. **确保数据库字段和 Java 属性类型匹配**,或使用 `TypeHandler`。 3. **使用 `toString()` 安全转换非字符串类型**。 4. **避免在 MyBatis 中混用不兼容的类型**,尤其是在 Map 和动态 SQL 中。 5. **调试时打印出 Map 的 value 类型**,有助于排查问题。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值