5.8 KiB
5.8 KiB
数据类型转换问题修复说明
🐛 问题描述
礼品卡保存时出现JSON解析错误,后端无法将字符串 "1" 转换为布尔类型:
{
"code": 1,
"message": "操作失败",
"error": "Cannot deserialize value of type `java.lang.Boolean` from String \"1\": only \"true\" or \"false\" recognized"
}
🔍 问题分析
1. 数据类型不匹配
前端发送的数据
// ❌ 错误:发送字符串类型
{
"isShow": "1" // 字符串类型
}
后端期望的数据
// ✅ 后端期望:布尔类型
public class ShopGift {
private Boolean isShow; // 布尔类型
}
2. 组件配置问题
错误的开关组件配置
<!-- ❌ 错误:使用字符串值 -->
<a-switch
v-model:checked="form.isShow"
:checked-value="'1'"
:un-checked-value="'0'"
/>
错误的初始值设置
// ❌ 错误:使用字符串初始值
const form = reactive({
isShow: '1' // 字符串类型
});
3. 类型定义不准确
错误的TypeScript类型定义
// ❌ 错误:定义为字符串类型
export interface ShopGift {
isShow?: string; // 与后端不匹配
}
✅ 修复方案
1. 修复数据类型转换
在保存时进行类型转换
/* 保存编辑 */
const save = () => {
formRef.value
.validate()
.then(() => {
loading.value = true;
const formData = {
...form
};
// ✅ 处理数据类型转换
if (formData.isShow !== undefined) {
formData.isShow = formData.isShow === '1' || formData.isShow === true;
}
console.log('提交的礼品卡数据:', formData);
const saveOrUpdate = isUpdate.value ? updateShopGift : addShopGift;
saveOrUpdate(formData)
.then((msg) => {
loading.value = false;
message.success(msg);
updateVisible(false);
emit('done');
})
.catch((e) => {
loading.value = false;
message.error(e.message);
console.error('保存失败:', e);
});
});
};
2. 修复组件配置
修复开关组件
<!-- ✅ 正确:使用布尔值 -->
<a-form-item label="展示状态" name="isShow">
<a-switch
v-model:checked="form.isShow"
checked-children="展示"
un-checked-children="隐藏"
/>
</a-form-item>
修复初始值设置
// ✅ 正确:使用布尔初始值
const form = reactive<ShopGift>({
id: undefined,
name: '',
code: '',
goodsId: undefined,
takeTime: undefined,
operatorUserId: undefined,
isShow: true, // 布尔类型
status: 0,
comments: '',
sortNumber: 100,
userId: undefined,
deleted: 0,
tenantId: undefined,
createTime: undefined,
updateTime: undefined,
num: 1
});
3. 修复类型定义
更新TypeScript接口
// ✅ 正确:定义为布尔类型
export interface ShopGift {
// 是否展示
isShow?: boolean; // 与后端匹配
}
4. 修复重置逻辑
更新表单重置值
// ✅ 正确:重置时使用布尔值
Object.assign(form, {
id: undefined,
name: '',
code: '',
goodsId: undefined,
takeTime: undefined,
operatorUserId: undefined,
isShow: true, // 布尔类型
status: 0,
comments: '',
sortNumber: 100,
userId: undefined,
deleted: 0,
tenantId: undefined,
createTime: undefined,
updateTime: undefined,
num: 1
});
📊 修复前后对比
修复前的问题
// ❌ 数据类型错误
{
"isShow": "1" // 字符串,后端无法解析
}
// ❌ 组件配置错误
:checked-value="'1'"
:un-checked-value="'0'"
// ❌ 类型定义错误
isShow?: string;
// ❌ 初始值错误
isShow: '1'
修复后的改进
// ✅ 数据类型正确
{
"isShow": true // 布尔值,后端可以正确解析
}
// ✅ 组件配置正确
// 使用默认的布尔值绑定
// ✅ 类型定义正确
isShow?: boolean;
// ✅ 初始值正确
isShow: true
🚀 修复效果
1. 数据传输正确
- ✅ 前端发送正确的布尔类型数据
- ✅ 后端能够正确解析数据
- ✅ 避免JSON解析错误
2. 组件行为正确
- ✅ 开关组件正确绑定布尔值
- ✅ 状态切换正常工作
- ✅ 表单验证通过
3. 类型安全
- ✅ TypeScript类型定义准确
- ✅ 编译时类型检查
- ✅ 代码提示正确
4. 用户体验提升
- ✅ 保存操作成功
- ✅ 状态显示正确
- ✅ 错误提示消失
🔧 技术要点
1. 前后端数据类型一致性
// 前端
isShow: boolean
// 后端
private Boolean isShow;
2. Ant Design开关组件最佳实践
<!-- 推荐:使用默认布尔值绑定 -->
<a-switch v-model:checked="form.isShow" />
<!-- 不推荐:自定义字符串值 -->
<a-switch
v-model:checked="form.isShow"
:checked-value="'1'"
:un-checked-value="'0'"
/>
3. 数据转换策略
// 兼容性转换:支持字符串和布尔值
if (formData.isShow !== undefined) {
formData.isShow = formData.isShow === '1' || formData.isShow === true;
}
4. TypeScript类型定义规范
// 与后端API保持一致
export interface ShopGift {
isShow?: boolean; // 明确的布尔类型
}
🎯 总结
通过修复数据类型不匹配问题,成功解决了礼品卡保存失败的问题:
- 类型统一:前后端使用一致的布尔类型
- 组件优化:开关组件使用标准的布尔值绑定
- 类型安全:TypeScript类型定义准确
- 兼容性好:数据转换逻辑支持多种输入格式
现在礼品卡的保存功能完全正常,用户可以成功创建和编辑礼品卡!