fix(core): 修复 BigDecimal 字段反序列化 null 值问题

- 新增 BigDecimalDeserializer 自定义反序列化器,处理 null值和空字符串
- 添加 DatabaseFixController 控制器,用于检查和修复数据库中的 null值问题
- 修改 ShopUserCouponController 中的查询逻辑,确保 BigDecimal 字段不为 null
- 更新 ShopCoupon 和 ShopUserCoupon 实体类,为 BigDecimal 字段添加 JsonSerialize 和 JsonInclude 注解
- 新增 SQL 脚本 fix_bigdecimal_null_values.sql,用于修复数据库中的 null 值问题- 修改 application.yml,配置 Jackson序列化和反序列化相关参数
This commit is contained in:
2025-08-15 03:39:48 +08:00
parent fa83ef5967
commit 5ffe469f0b
8 changed files with 419 additions and 13 deletions

View File

@@ -24,6 +24,12 @@ spring:
date-format: yyyy-MM-dd HH:mm:ss
serialization:
write-dates-as-timestamps: false
write-null-map-values: false
deserialization:
fail-on-unknown-properties: false
fail-on-null-for-primitives: false
accept-empty-string-as-null-object: true
default-property-inclusion: non_null
# 连接池配置
datasource:

View File

@@ -0,0 +1,107 @@
-- 修复BigDecimal字段的null值问题
-- 将null值替换为0.00避免JSON序列化异常
-- ========================================
-- 1. 修复用户优惠券表的null值
-- ========================================
-- 检查当前null值情况
SELECT
'shop_user_coupon null值检查' as table_name,
COUNT(*) as total_records,
COUNT(CASE WHEN reduce_price IS NULL THEN 1 END) as null_reduce_price,
COUNT(CASE WHEN min_price IS NULL THEN 1 END) as null_min_price
FROM shop_user_coupon;
-- 修复reduce_price字段的null值
UPDATE shop_user_coupon
SET reduce_price = 0.00
WHERE reduce_price IS NULL;
-- 修复min_price字段的null值
UPDATE shop_user_coupon
SET min_price = 0.00
WHERE min_price IS NULL;
-- ========================================
-- 2. 修复优惠券模板表的null值
-- ========================================
-- 检查当前null值情况
SELECT
'shop_coupon null值检查' as table_name,
COUNT(*) as total_records,
COUNT(CASE WHEN reduce_price IS NULL THEN 1 END) as null_reduce_price,
COUNT(CASE WHEN min_price IS NULL THEN 1 END) as null_min_price
FROM shop_coupon;
-- 修复reduce_price字段的null值
UPDATE shop_coupon
SET reduce_price = 0.00
WHERE reduce_price IS NULL;
-- 修复min_price字段的null值
UPDATE shop_coupon
SET min_price = 0.00
WHERE min_price IS NULL;
-- ========================================
-- 3. 设置字段默认值(可选)
-- ========================================
-- 为用户优惠券表字段设置默认值
ALTER TABLE shop_user_coupon
MODIFY COLUMN reduce_price DECIMAL(10,2) DEFAULT 0.00 COMMENT '满减券-减免金额';
ALTER TABLE shop_user_coupon
MODIFY COLUMN min_price DECIMAL(10,2) DEFAULT 0.00 COMMENT '最低消费金额';
-- 为优惠券模板表字段设置默认值
ALTER TABLE shop_coupon
MODIFY COLUMN reduce_price DECIMAL(10,2) DEFAULT 0.00 COMMENT '满减券-减免金额';
ALTER TABLE shop_coupon
MODIFY COLUMN min_price DECIMAL(10,2) DEFAULT 0.00 COMMENT '最低消费金额';
-- ========================================
-- 4. 验证修复结果
-- ========================================
-- 检查修复后的情况
SELECT
'shop_user_coupon 修复后检查' as table_name,
COUNT(*) as total_records,
COUNT(CASE WHEN reduce_price IS NULL THEN 1 END) as null_reduce_price,
COUNT(CASE WHEN min_price IS NULL THEN 1 END) as null_min_price,
MIN(reduce_price) as min_reduce_price,
MIN(min_price) as min_min_price
FROM shop_user_coupon;
SELECT
'shop_coupon 修复后检查' as table_name,
COUNT(*) as total_records,
COUNT(CASE WHEN reduce_price IS NULL THEN 1 END) as null_reduce_price,
COUNT(CASE WHEN min_price IS NULL THEN 1 END) as null_min_price,
MIN(reduce_price) as min_reduce_price,
MIN(min_price) as min_min_price
FROM shop_coupon;
-- ========================================
-- 5. 检查其他可能的BigDecimal字段
-- ========================================
-- 检查订单相关表的BigDecimal字段
SELECT
'shop_order BigDecimal字段检查' as check_type,
COUNT(*) as total_records,
COUNT(CASE WHEN order_price IS NULL THEN 1 END) as null_order_price,
COUNT(CASE WHEN pay_price IS NULL THEN 1 END) as null_pay_price
FROM shop_order;
-- 如果发现null值可以执行以下修复
/*
UPDATE shop_order SET order_price = 0.00 WHERE order_price IS NULL;
UPDATE shop_order SET pay_price = 0.00 WHERE pay_price IS NULL;
*/
SELECT 'BigDecimal null值修复完成' as result;