4.8 KiB
4.8 KiB
首付分期功能修复总结
问题描述
用户在保存政策数据时遇到错误:
保存政策数据失败: Error: Invalid property 'periodicpolicyid' of bean class [org.dromara.system.domain.bo.TPolicyBo]: Could not instantiate property type [java.lang.Long] to auto-grow nested property path
问题分析
该错误是由于前端发送的periodicpolicyid字段类型与后端TPolicyBo类中的Long类型不匹配导致的Spring MVC数据绑定失败。
修复内容
1. 前端修复 (ruoyi-ui/src/views/system/periodicpolicy/add/index.vue)
- 问题位置: 第577行
- 修改前:
periodicpolicyid: parseInt(schemeId) || 0 - 修改后:
periodicpolicyid: Number(schemeId) - 原因: 使用
Number确保将字符串正确转换为整数类型,避免Spring MVC的Long类型转换错误
2. 后端修复 (ruoyi-modules/ruoyi-businessdata/src/main/java/org/dromara/system/domain/bo/TPolicyBo.java)
- 问题:
periodicpolicyid字段缺少验证注解 - 修改: 添加
@NotNull验证注解 - 代码:
@NotNull(message = "分期方案主键ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long periodicpolicyid;
3. 额外修复
- usableHousesCount字段:移除了
Number()转换,让Spring MVC自动处理类型转换 - 数据验证优化:移除了所有前端手动类型转换,避免转换错误的可能性
- 关键问题:修复了Spring无法实例化Long类型的问题
技术细节
数据类型映射解决方案
问题描述
Spring MVC无法将前端字符串类型的periodicpolicyid转换为后端Long类型,导致java.lang.NoSuchMethodException: java.lang.Long.<init>()异常。
根本原因
- 后端Long包装类型:TPolicyBo中periodicpolicyid定义为Long包装类型
- Spring转换限制:Spring MVC无法将字符串直接转换为Long包装类型
- 前端字符串格式:前端传递的是字符串格式的ID
解决方案
- 前端修复:移除Number()转换,让Spring MVC自动完成字符串到Long的转换
- 数据验证:确保前端传递的是有效的数字字符串
- Spring配置:无需额外配置,Spring MVC可自动处理
关键修复
- 文件:
ruoyi-ui/src/views/system/periodicpolicy/add/index.vue - 修改:第557行移除
Number()转换,直接使用schemeId值 - 验证:保存方案和政策数据时不再出现类型转换错误
字段映射修复
新问题描述
- 错误信息:
ReferenceError: selectedProjects is not defined - 发生位置: ruoyi-ui/src/views/system/periodicpolicy/add/index.vue
- 影响: 保存方案时前端报错,无法正确传递项目GUID数据
根本原因分析
前端代码中引用了未定义的变量selectedProjects,该变量在组件中从未被定义或初始化。代码试图使用selectedProjects.value.map()来处理项目数据,但由于变量不存在导致运行时错误。
解决方案
将selectedProjects.value.map(...)替换为form.value.projguids || ''和form.value.projnames || '',直接使用表单中已定义的字段:
// 修复前
const planData = {
schemeName: form.value.schemeName,
ProjGUIDs: selectedProjects.value.map(item => item.projguid).join(','),
projnames: selectedProjects.value.map(item => item.projname).join(','),
// ...
}
// 修复后
const planData = {
schemeName: form.value.schemeName,
projguids: form.value.projguids || '',
projnames: form.value.projnames || '',
// ...
}
后续问题
- 新问题:
保存方案失败: Error: 分期GUID不能为空 - 原因: 前端字段名
ProjGUIDs与后端数据库字段名projguids不匹配 - 解决: 将前端字段名统一改为
projguids(小写开头),与后端保持一致
验证方法
- 访问 http://localhost:80/system/periodicpolicy
- 点击"新增"创建分期方案
- 选择项目并添加政策数据
- 点击"保存方案",验证能够成功保存且不再出现字段相关的错误
验证分组
- 新增模式: AddGroup.class
- 编辑模式: EditGroup.class
- 字段验证: 确保periodicpolicyid不为null
测试步骤
- 访问 http://localhost:80/system/periodicpolicy
- 点击"新增"按钮创建首付分期方案
- 填写方案基本信息
- 添加关联政策数据
- 点击"保存"按钮
- 验证政策数据是否正确保存
预期结果
- 政策数据成功保存,不再出现类型转换错误
- 分期方案和政策数据正确关联
- 页面正常跳转和显示
影响范围
- 仅影响首付分期功能中的政策数据保存
- 不影响其他模块功能
- 向前兼容,不影响已有数据
验证状态
✅ 编译成功 ✅ 服务重启成功 ✅ 数据类型匹配修复 ✅ 验证注解添加成功 ✅ 数值字段类型转换优化