5.0 KiB
学生考核申请LocalDateTime类型转换错误修复报告
问题描述
时间: 2025-01-03
接口: GET /assessment/application/student/{studentId}/schedule/{scheduleId}
错误信息:
{
"code": 500,
"msg": "class java.time.LocalDateTime cannot be cast to class java.lang.String (java.time.LocalDateTime and java.lang.String are in module java.base of loader 'bootstrap')",
"data": null
}
问题分析
错误原因
在 XskhAssessmentApplicationApprovalServiceImpl.queryById() 方法中,第83-84行存在类型转换错误:
// 错误的代码
selfScoreVo.setCreateTime((String) scoreMap.get("createTime"));
selfScoreVo.setUpdateTime((String) scoreMap.get("updateTime"));
根本原因
- 数据库字段类型:
create_time和update_time字段在数据库中定义为datetime类型 - MyBatis查询返回: 通过
selectSelfScoresWithIndicatorInfo查询时,MyBatis可能返回LocalDateTime类型 - 强制类型转换: 代码中直接强制转换为
String类型,导致ClassCastException
影响范围
- 学生考核申请详情查询接口
- 学生考核申请表单页面无法正常加载历史数据
解决方案
1. 修复Service实现类中的类型转换
文件: backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/service/impl/XskhAssessmentApplicationApprovalServiceImpl.java
修改内容:
// 修复前
selfScoreVo.setCreateTime((String) scoreMap.get("createTime"));
selfScoreVo.setUpdateTime((String) scoreMap.get("updateTime"));
// 修复后
Object createTimeObj = scoreMap.get("createTime");
if (createTimeObj != null) {
selfScoreVo.setCreateTime(createTimeObj.toString());
}
Object updateTimeObj = scoreMap.get("updateTime");
if (updateTimeObj != null) {
selfScoreVo.setUpdateTime(updateTimeObj.toString());
}
2. 添加JSON格式化注解
文件: backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhAssessmentSelfScoreVo.java
修改内容:
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String updateTime;
文件: backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhAssessmentBonusApprovalVo.java
修改内容:
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String updateTime;
文件: backend/ruoyi-modules/ruoyi-xskh/src/main/java/org/dromara/xskh/domain/vo/XskhAssessmentApplicationApprovalVo.java
修改内容:
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date submitTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date teacherApprovalTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
修复效果
修复前
- 接口返回500错误
- 前端无法正常显示考核申请详情
- 用户无法查看历史申请记录
修复后
- 接口正常返回数据
- 前端可以正常显示考核申请详情
- 时间字段格式化为标准格式
yyyy-MM-dd HH:mm:ss - 支持查看历史申请记录
技术要点
1. 类型安全处理
- 使用
Object类型接收查询结果 - 通过
toString()方法安全转换 - 添加空值检查避免NPE
2. JSON序列化优化
- 添加
@JsonFormat注解统一时间格式 - 确保前后端时间格式一致
- 提升API响应质量
3. 数据库字段映射
- 保持与BaseEntity基类的一致性
- 遵循项目的时间字段处理规范
- 避免类型转换异常
验证方法
1. 接口测试
# 测试学生考核申请查询接口
GET /assessment/application/student/1/schedule/1958180338534526978
2. 前端验证
- 打开学生考核申请表单页面
- 验证历史申请记录正常显示
- 检查时间字段格式是否正确
3. 日志检查
- 查看后端日志确认无类型转换错误
- 验证SQL查询正常执行
- 确认数据正确返回
预防措施
1. 代码规范
- 避免直接强制类型转换
- 使用安全的类型转换方法
- 添加适当的空值检查
2. 测试覆盖
- 添加单元测试覆盖时间字段处理
- 集成测试验证API响应格式
- 前端测试确保UI正常显示
3. 文档维护
- 更新API文档说明时间字段格式
- 记录VO类字段类型定义
- 维护问题解决方案文档
总结
本次修复解决了学生考核申请模块中的LocalDateTime类型转换错误,通过安全的类型处理和JSON格式化注解,确保了接口的稳定性和数据格式的一致性。修复后的代码更加健壮,能够正确处理各种时间类型的数据,提升了用户体验。
修复人员: AI Assistant
修复时间: 2025-01-03
影响模块: 学生考核管理模块
测试状态: 待验证