Files
hzdyjs/docs/问题解决方案/学生考核申请LocalDateTime类型转换错误修复报告.md
T
2025-08-21 16:24:34 +08:00

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"));

根本原因

  1. 数据库字段类型: create_time 和 update_time 字段在数据库中定义为 datetime 类型
  2. MyBatis查询返回: 通过 selectSelfScoresWithIndicatorInfo 查询时,MyBatis可能返回 LocalDateTime 类型
  3. 强制类型转换: 代码中直接强制转换为 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
影响模块: 学生考核管理模块
测试状态: 待验证