// 列表页面调用详情
function handleDetail(row) {
proxy.$refs['applicationDetailRef']?.handleDetail(row.id)
}
// 详情组件中的处理
function handleDetail(id) {
getWorkStudyApplication(id).then(response => {
// 数据处理...
})
}
// Controller
@GetMapping("/{id}")
public R<JcbtWorkStudyApplicationVo> getInfo(@PathVariable Long id) {
return R.ok(workStudyApplicationService.queryById(id));
}
// Service
public JcbtWorkStudyApplicationVo queryById(Long id) {
JcbtWorkStudyApplicationVo applicationVo = baseMapper.selectVoById(id);
return applicationVo; // 返回 null
}
经过调试发现:
baseMapper.selectById(id) 能够成功查询到Entity对象baseMapper.selectVoById(id) 返回null问题出现在 BaseMapperPlus 的 selectVoById 实现中:
// BaseMapperPlus.java 第144-150行
default <C> C selectVoById(Serializable id, Class<C> voClass) {
T obj = this.selectById(id); // Entity查询成功
if (ObjectUtil.isNull(obj)) {
return null;
}
return MapstructUtils.convert(obj, voClass); // MapStruct转换失败
}
核心问题: MapstructUtils.convert() 转换从 Entity 到 VO 时失败,导致返回 null。
在 JcbtWorkStudyApplicationMapper.xml 中添加自定义的 selectVoById 方法,直接使用SQL查询和ResultMap映射,避免MapStruct转换:
<!-- 根据ID查询VO对象 - 自定义实现 -->
<select id="selectVoById" parameterType="java.io.Serializable" resultMap="JcbtWorkStudyApplicationResult">
<include refid="selectJcbtWorkStudyApplicationVo"/>
WHERE id = #{id}
AND deleted = 0
</select>
确保VO类包含所有必要的基础字段,避免字段缺失导致的映射问题:
// JcbtWorkStudyApplicationVo.java 必须包含的基础字段
private Long createBy; // 创建者
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime; // 创建时间
private Long updateBy; // 更新者
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime; // 更新时间
JcbtWorkStudyApplicationMapper extends BaseMapperPlus<Entity, VO>@AutoMapper(target = JcbtWorkStudyApplication.class) 配置有误<resultMap type="org.dromara.jcbt.domain.vo.JcbtWorkStudyApplicationVo" id="JcbtWorkStudyApplicationResult">
<result property="id" column="id"/>
<result property="studentName" column="student_name"/>
<result property="positionName" column="position_name"/>
<!-- ... 其他字段映射 ... -->
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
</resultMap>
backend/ruoyi-modules/ruoyi-jcbt/src/main/resources/mapper/jcbt/JcbtWorkStudyApplicationMapper.xml
selectVoById 方法在 JcbtWorkStudyApplicationServiceImpl.java 中添加了详细的调试日志:
@Override
public JcbtWorkStudyApplicationVo queryById(Long id) {
log.info("查询勤工俭学申请信息,ID: {}", id);
JcbtWorkStudyApplicationVo applicationVo = baseMapper.selectVoById(id);
log.info("查询结果: {}", applicationVo != null ? "找到记录" : "未找到记录");
if (applicationVo == null) {
// 调试:尝试直接查询Entity
JcbtWorkStudyApplication entity = baseMapper.selectById(id);
log.info("直接查询Entity结果: {}", entity != null ? "找到记录" : "未找到记录");
return null;
}
// ... 其他逻辑 ...
}
# 使用Python脚本测试
python3 test_api.py
# 或者使用curl测试
curl -X GET "http://localhost:8080/jcbt/workStudyApplication/1" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json"
查看后端日志中的调试信息:
tail -f backend/logs/admin.log | grep "查询勤工俭学申请信息"
@JsonFormat注解格式化时间字段@AutoMapper注解正确配置.cursor/cursorrules-backend.md → "VO类基础字段规范"修复人员: AI Assistant
修复时间: 2025-01-03
修复状态: ✅ 已完成,待验证