Browse Source

合并 Spring Boot 4.1.1 升级(Jackson 3)到 develop,回归 390 项通过

tanlie 13 giờ trước cách đây
mục cha
commit
804685ba8c
60 tập tin đã thay đổi với 351 bổ sung và 148 xóa
  1. 145 0
      SpringBoot4-升级说明.md
  2. 34 0
      tools/migrate_jackson3.py
  3. 4 2
      tools/seed_store_user.py
  4. 3 2
      tools/smoke_camel.py
  5. 24 3
      yoshop-java/pom.xml
  6. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiAddressController.java
  7. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiContentController.java
  8. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiGoodsController.java
  9. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiMarketingController.java
  10. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiOrderController.java
  11. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiRechargeController.java
  12. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiRefundController.java
  13. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiUploadController.java
  14. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/controller/ApiUserController.java
  15. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiAddressService.java
  16. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiCartService.java
  17. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiCheckoutService.java
  18. 4 4
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiCommentService.java
  19. 3 3
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiContentService.java
  20. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiCouponService.java
  21. 3 3
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiGoodsService.java
  22. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiLogService.java
  23. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiOrderCommentService.java
  24. 2 2
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiOrderService.java
  25. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiRechargeService.java
  26. 2 2
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiRefundService.java
  27. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiSettingService.java
  28. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiUserCouponService.java
  29. 1 1
      yoshop-java/src/main/java/cn/yoshop/api/service/ApiUserService.java
  30. 3 3
      yoshop-java/src/main/java/cn/yoshop/api/support/ApiView.java
  31. 1 1
      yoshop-java/src/main/java/cn/yoshop/common/auth/AdminAuthInterceptor.java
  32. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/auth/AdminTokenStore.java
  33. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/auth/RedisTokenStore.java
  34. 1 1
      yoshop-java/src/main/java/cn/yoshop/common/auth/StoreAuthInterceptor.java
  35. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/Coupon.java
  36. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/DeliveryRule.java
  37. 4 4
      yoshop-java/src/main/java/cn/yoshop/common/entity/Goods.java
  38. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/GoodsSku.java
  39. 3 3
      yoshop-java/src/main/java/cn/yoshop/common/entity/Order.java
  40. 1 1
      yoshop-java/src/main/java/cn/yoshop/common/entity/OrderDelivery.java
  41. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/OrderGoods.java
  42. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/OrderRefund.java
  43. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/RechargeOrder.java
  44. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/RechargeOrderPlan.java
  45. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/RechargePlan.java
  46. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/User.java
  47. 3 3
      yoshop-java/src/main/java/cn/yoshop/common/entity/UserBalanceLog.java
  48. 2 2
      yoshop-java/src/main/java/cn/yoshop/common/entity/UserCoupon.java
  49. 1 1
      yoshop-java/src/main/java/cn/yoshop/common/entity/UserPointsLog.java
  50. 10 7
      yoshop-java/src/main/java/cn/yoshop/common/util/PhpFloatSerializer.java
  51. 1 1
      yoshop-java/src/main/java/cn/yoshop/common/util/PhpStr.java
  52. 13 13
      yoshop-java/src/main/java/cn/yoshop/common/util/UserLiteSerializer.java
  53. 31 33
      yoshop-java/src/main/java/cn/yoshop/config/RedisConfig.java
  54. 1 2
      yoshop-java/src/main/java/cn/yoshop/config/RedisConfigCacheManager.java
  55. 3 3
      yoshop-java/src/main/java/cn/yoshop/store/service/ClientSettingService.java
  56. 1 1
      yoshop-java/src/main/java/cn/yoshop/store/service/OrderDeliveryService.java
  57. 2 2
      yoshop-java/src/main/java/cn/yoshop/store/service/OrderService.java
  58. 2 2
      yoshop-java/src/main/java/cn/yoshop/store/service/PageDesignService.java
  59. 2 2
      yoshop-java/src/main/java/cn/yoshop/store/service/PrinterService.java
  60. 1 1
      yoshop-java/src/main/java/cn/yoshop/store/service/SettingService.java

+ 145 - 0
SpringBoot4-升级说明.md

@@ -0,0 +1,145 @@
+# Spring Boot 3.2.5 → 4.1.1 升级说明
+
+升级日期:2026-10-19
+分支:`feature/spring-boot-4`(基于 `develop` 的 `147bbe6`,即已升到 3.5.16 的提交)
+
+## 一、版本变化
+
+| 组件 | 升级前 | 升级后 |
+|---|---|---|
+| Spring Boot | 3.2.5 | **4.1.1** |
+| Spring Framework | 6.1.x | 7.0.9(Boot 传递) |
+| Spring Security (crypto) | 6.2.x | 7.0.x |
+| Jakarta EE 基线 | 10(Servlet 6.0 / Tomcat 10.1) | **11(Servlet 6.1 / Tomcat 11.0.24)** |
+| Jackson | 2.15 | **3.1.5**(`tools.jackson.*`) |
+| MyBatis-Plus | 3.5.5 / spring-boot3-starter | **3.5.17 / spring-boot4-starter** |
+| JDK | 21 | 21(不变,Boot 4 基线为 17) |
+
+升级前先单独落了一版 3.5.16(提交 `147bbe6`),确认零改动即可通过全部回归,再进 4.x,避免跨两个大版本混在一起排错。
+
+## 二、代码改动(58 文件)
+
+### 1. Jackson 包名迁移(54 文件,纯 import)
+
+`com.fasterxml.jackson.databind|core` → `tools.jackson.databind|core`。
+
+**注解不动**:`@JsonProperty` / `@JsonIgnore` / `@JsonInclude` / `@JsonView` 仍在
+`com.fasterxml.jackson.annotation`(Jackson 3 为向后兼容刻意保留),涉及 63 个文件一行未改。
+
+批量脚本:`tools/migrate_jackson3.py`(可重复执行,`--dry` 只统计不写)。
+
+### 2. 两个自定义序列化器改写
+
+Jackson 3 把 `JsonSerializer` 更名 `ValueSerializer`,第三个参数换成 `SerializationContext`,
+异常由受检的 `IOException` 改为非受检的 `JacksonException`:
+
+```java
+// 旧
+public class PhpFloatSerializer extends JsonSerializer<Double> {
+    public void serialize(Double v, JsonGenerator gen, SerializerProvider p) throws IOException
+// 新
+public class PhpFloatSerializer extends ValueSerializer<Double> {
+    public void serialize(Double v, JsonGenerator gen, SerializationContext ctxt) throws JacksonException
+```
+
+- `common/util/PhpFloatSerializer.java`
+- `common/util/UserLiteSerializer.java`(另:`new ObjectMapper().setSerializationInclusion(..)`
+  不可用,改为 `JsonMapper.builder().build()`;默认包含策略本就是 ALWAYS)
+
+这两个类被 8 处 `@JsonSerialize(using = ...)` 引用,改完实体侧无需改动。
+
+### 3. Redis 序列化器重写
+
+`config/RedisConfig.java`:
+
+- `new ObjectMapper()` + `setVisibility(..)` + `enableDefaultTyping(NON_FINAL)` 全部不可用
+  (Jackson 3 的 mapper 不可变,这些方法已移除)。
+- 改用 Spring Data Redis 4 新增的 `GenericJacksonJsonRedisSerializer`:
+  ```java
+  GenericJacksonJsonRedisSerializer.builder().enableUnsafeDefaultTyping().build()
+  ```
+  语义等价于原 `GenericJackson2JsonRedisSerializer` / default typing(写 `@class` 类型信息),
+  `RedisTemplate<String,Object>` 与 `RedisCacheManager` 共用同一个工厂方法。
+- `config/RedisConfigCacheManager.java` 的 `DEFAULT_PAIR` 同步换成 `RedisConfig.jsonSerializer()`。
+
+> 注:项目内 `@Cacheable` 用量为 0,缓存管理器实际未被业务使用,因此即便有旧缓存格式差异也不影响业务。
+
+### 4. MyBatis-Plus 两处适配
+
+1. **分页插件拆包**:MP 3.5.9 起 `PaginationInnerInterceptor` 移到独立模块,需显式引入
+   `com.baomidou:mybatis-plus-jsqlparser`(版本随 `mybatis-plus.version`)。
+   不加会报 `cannot find symbol: class PaginationInnerInterceptor`。
+2. **JSON TypeHandler 换 Jackson 3 版**:`Goods.deliveryType` 原来用 `JacksonTypeHandler`(Jackson 2 实现),
+   Boot 4 不再带 Jackson 2,启动时会 `NoClassDefFoundError: com/fasterxml/jackson/core/JacksonException`。
+   改为 MP 3.5.17 提供的 `Jackson3TypeHandler`。
+
+### 5. Lombok 注解处理器需显式声明
+
+Boot 4 的 `maven-compiler-plugin` 3.15.0 不再从 classpath 自动发现注解处理器,
+只配 `<parameters>true</parameters>` 时 `@Data` 完全不生成方法(一开始报了 200 个
+"cannot find symbol: getXxx")。pom 里补:
+
+```xml
+<plugin>
+  <groupId>org.apache.maven.plugins</groupId>
+  <artifactId>maven-compiler-plugin</artifactId>
+  <configuration>
+    <annotationProcessorPaths>
+      <path>
+        <groupId>org.projectlombok</groupId>
+        <artifactId>lombok</artifactId>
+        <version>${lombok.version}</version>
+      </path>
+    </annotationProcessorPaths>
+  </configuration>
+</plugin>
+```
+
+## 三、不受影响的部分(已核实)
+
+- **时间格式**:实体时间字段是 `Integer` 时间戳 + `getCreateTimeText()` 手工 `TimeUtil.format`,
+  不走 Jackson 日期序列化。Jackson 3 把 `WRITE_DATES_AS_TIMESTAMPS` 默认改为 ISO-8601 的变化
+  对本项目出参**零影响**,`spring.jackson.date-format` 保留即可。
+- **`@JsonView`**:`spring.jackson.mapper.default-view-inclusion: true` 在 Boot 4 仍有效
+  (已实测 `goods/list` 不含 `content`、`goods/detail` 含 `content`)。
+- **`spring.jackson.date-format` / `time-zone` / `mapper.*`**:配置项在 4.1.1 中均仍存在。
+- **`ObjectNode.remove(Collection)` / `createObjectNode()` / `valueToTree()`**:签名未变,`ApiView` 只改了 import。
+- **多模块拦截器**:`WebMvcConfig` / `StoreAuthInterceptor` / `AdminAuthInterceptor` / `ApiAuthInterceptor` 未改。
+- **PHP `$2y$` 口令**:Spring Security 7 的 `BCryptPasswordEncoder` 仍能校验
+  (用 PHP 8.2 `password_hash` 生成 `$2y$` 哈希实测登录成功)。
+
+## 四、唯一的行为变化(可接受)
+
+Jackson 3 默认开启 `SORT_PROPERTIES_ALPHABETICALLY`,实体经 `valueToTree` 后**字段顺序变为字母序**
+(如 `goodsId` 之前排在 `goodsName` 前,现在 `aloneGradeEquity` 开头)。字段名与值不变,
+前端按名取值不受影响;手工 `put` 的 `ObjectNode` 仍保持插入顺序。
+旧的 `compare_*.py` 若按字节比 JSON 会误报,这些脚本已随驼峰改造废弃。
+
+## 五、回归结果(全部在 Boot 4.1.1 上跑)
+
+| 脚本 | 内容 | 结果 |
+|---|---|---|
+| `test_api_batch1.py` | api 只读接口 | 52 / 0 |
+| `test_api_batch2.py` | 购物车/结算/订单/地址 | 97 / 0 |
+| `test_api_batch3.py` | 用户中心/售后/充值/上传 | 99 / 0 |
+| `test_api_batch4.py` | 登录/验证码/收银台/支付回调 | 77 / 0 |
+| `test_admin_api.py` | 平台后台 | 45 / 0 |
+| `test_token_user.py` | store 登录态(Redis) | 20 / 0 |
+| `smoke_camel.py` | 驼峰冒烟 | 全部通过 |
+
+合计 **390 项断言,0 失败**。
+
+## 六、回滚方式
+
+```bash
+git checkout develop          # Boot 3.5.16,随时可发布
+# 或
+git checkout feature/spring-boot-4
+```
+
+## 七、后续可选
+
+- Boot 4 仍保留 `spring-boot-jackson2` 模块(`spring.jackson2.*` 属性),
+  万一某个第三方库只支持 Jackson 2,可用它过渡,但属废弃路径,不建议长期依赖。
+- 若将来引入 `@Cacheable`,注意 Boot 4 + Jackson 3 的缓存值格式与 Jackson 2 的
+  `GenericJackson2JsonRedisSerializer` 不完全一致(`@class` vs 数组式 typing),切流时先清缓存。

+ 34 - 0
tools/migrate_jackson3.py

@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+"""Spring Boot 4 / Jackson 3 迁移:包名批量替换。
+
+Jackson 3 把 com.fasterxml.jackson.databind|core 迁到 tools.jackson.*,
+但注解(com.fasterxml.jackson.annotation)为向后兼容保持在原包,不能动。
+
+用法:python tools/migrate_jackson3.py [--dry]
+"""
+import sys
+
+from _root import ROOT
+
+SRC = ROOT / "yoshop-java/src/main/java"
+RULES = [
+    ("com.fasterxml.jackson.databind", "tools.jackson.databind"),
+    ("com.fasterxml.jackson.core", "tools.jackson.core"),
+]
+
+dry = "--dry" in sys.argv
+changed = []
+
+for f in SRC.rglob("*.java"):
+    text = f.read_text(encoding="utf-8")
+    new = text
+    for old, rep in RULES:
+        new = new.replace(old, rep)
+    if new != text:
+        changed.append(f)
+        if not dry:
+            f.write_text(new, encoding="utf-8")
+
+print("%s %d files" % ("would change" if dry else "changed", len(changed)))
+for f in changed[:10]:
+    print("  ", f.relative_to(ROOT))

+ 4 - 2
tools/seed_store_user.py

@@ -20,11 +20,13 @@ conn = pymysql.connect(host="192.168.1.177", user="root", password=PWD,
 cur = conn.cursor()
 cur.execute("delete from yoshop_store_user where user_name=%s", (NAME,))
 if sys.argv[1] == "add":
+    # 可选第二参数:自定义口令哈希(默认 123456 的 $2a$;传 PHP password_hash 的 $2y$ 可验证兼容性)
+    pwd_hash = sys.argv[2] if len(sys.argv) > 2 else HASH
     cur.execute(
         "insert into yoshop_store_user (user_name,password,real_name,is_super,is_delete,"
         "sort,store_id,create_time,update_time) values (%s,%s,%s,0,0,100,10001,"
-        "unix_timestamp(),unix_timestamp())", (NAME, HASH, "temp"))
-    print("seeded", NAME, cur.lastrowid)
+        "unix_timestamp(),unix_timestamp())", (NAME, pwd_hash, "temp"))
+    print("seeded", NAME, cur.lastrowid, pwd_hash[:7])
 else:
     print("removed", NAME)
 conn.close()

+ 3 - 2
tools/smoke_camel.py

@@ -4,7 +4,7 @@ import re
 import sys
 
 sys.path.insert(0, "tools")
-from test_redis_auth import login, S, BASE, Redis, PREFIX
+from test_token_user import login, S, BASE, Redis, PREFIX
 
 
 def check_snake(obj, path="$"):
@@ -20,7 +20,8 @@ def check_snake(obj, path="$"):
     return hits
 
 
-tok = login("redistest_admin", "123456")["data"]["token"]
+# 账号由 tools/seed_store_user.py 创建
+tok = login()["data"]["token"]
 H = {"Access-Token": tok}
 
 

+ 24 - 3
yoshop-java/pom.xml

@@ -7,7 +7,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.5.16</version>
+        <version>4.1.1</version>
         <relativePath/>
     </parent>
 
@@ -19,7 +19,7 @@
 
     <properties>
         <java.version>21</java.version>
-        <mybatis-plus.version>3.5.5</mybatis-plus.version>
+        <mybatis-plus.version>3.5.17</mybatis-plus.version>
         <hutool.version>5.8.27</hutool.version>
     </properties>
 
@@ -38,7 +38,13 @@
         </dependency>
         <dependency>
             <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <artifactId>mybatis-plus-spring-boot4-starter</artifactId>
+            <version>${mybatis-plus.version}</version>
+        </dependency>
+        <!-- 3.5.9 起分页插件(PaginationInnerInterceptor)拆到独立模块,要单独引入 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-jsqlparser</artifactId>
             <version>${mybatis-plus.version}</version>
         </dependency>
         <dependency>
@@ -75,6 +81,21 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
+            <!-- Spring Boot 4 的 compiler 插件不再从 classpath 自动发现注解处理器,
+                 需显式声明 Lombok,否则 @Data/@Getter 不生成方法 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                            <version>${lombok.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiAddressController.java

@@ -7,7 +7,7 @@ import cn.yoshop.common.entity.User;
 import cn.yoshop.common.exception.BizException;
 import cn.yoshop.common.util.Params;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiContentController.java

@@ -2,7 +2,7 @@ package cn.yoshop.api.controller;
 
 import cn.yoshop.api.service.ApiContentService;
 import cn.yoshop.common.api.R;
-import com.fasterxml.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ArrayNode;
 
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestMapping;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiGoodsController.java

@@ -7,7 +7,7 @@ import cn.yoshop.common.entity.User;
 import cn.yoshop.common.exception.BizException;
 import cn.yoshop.common.page.PageVO;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiMarketingController.java

@@ -13,7 +13,7 @@ import cn.yoshop.common.page.PageVO;
 import cn.yoshop.common.util.Params;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiOrderController.java

@@ -8,7 +8,7 @@ import cn.yoshop.common.entity.User;
 import cn.yoshop.common.exception.BizException;
 import cn.yoshop.common.util.Params;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiRechargeController.java

@@ -7,7 +7,7 @@ import cn.yoshop.common.entity.User;
 import cn.yoshop.common.page.PageVO;
 import cn.yoshop.common.util.Params;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiRefundController.java

@@ -8,7 +8,7 @@ import cn.yoshop.common.exception.BizException;
 import cn.yoshop.common.page.PageVO;
 import cn.yoshop.common.util.Params;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiUploadController.java

@@ -6,7 +6,7 @@ import cn.yoshop.common.api.R;
 import cn.yoshop.common.entity.UploadFile;
 import cn.yoshop.store.service.UploadService;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestMapping;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/controller/ApiUserController.java

@@ -8,7 +8,7 @@ import cn.yoshop.common.entity.User;
 import cn.yoshop.common.page.PageVO;
 import cn.yoshop.common.util.Params;
 
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.RequestBody;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiAddressService.java

@@ -9,7 +9,7 @@ import cn.yoshop.common.mapper.UserAddressMapper;
 import cn.yoshop.common.mapper.UserMapper;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiCartService.java

@@ -12,7 +12,7 @@ import cn.yoshop.common.exception.BizException;
 import cn.yoshop.common.mapper.CartMapper;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiCheckoutService.java

@@ -31,7 +31,7 @@ import cn.yoshop.common.util.Params;
 import cn.yoshop.common.util.PhpStr;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 4 - 4
yoshop-java/src/main/java/cn/yoshop/api/service/ApiCommentService.java

@@ -16,8 +16,8 @@ import cn.yoshop.common.page.PageVO;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -207,7 +207,7 @@ public class ApiCommentService {
         ObjectNode node = view.of(user);
         view.hide(node, "isDelete", "storeId", "createTime", "updateTime");
         node.put("mobile", maskMobile(user.getMobile()));
-        return view.mapper().convertValue(node, new com.fasterxml.jackson.core.type.TypeReference<LinkedHashMap<String, Object>>() {
+        return view.mapper().convertValue(node, new tools.jackson.core.type.TypeReference<LinkedHashMap<String, Object>>() {
         });
     }
 
@@ -220,7 +220,7 @@ public class ApiCommentService {
         view.hide(node, "image", "content", "storeId", "createTime");
         String imageUrl = goods.getImage() == null ? null : goods.getImage().getPreviewUrl();
         node.put("goodsImage", imageUrl);
-        return view.mapper().convertValue(node, new com.fasterxml.jackson.core.type.TypeReference<LinkedHashMap<String, Object>>() {
+        return view.mapper().convertValue(node, new tools.jackson.core.type.TypeReference<LinkedHashMap<String, Object>>() {
         });
     }
 

+ 3 - 3
yoshop-java/src/main/java/cn/yoshop/api/service/ApiContentService.java

@@ -23,9 +23,9 @@ import cn.yoshop.store.service.PageDesignService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiCouponService.java

@@ -10,7 +10,7 @@ import cn.yoshop.common.mapper.UserCouponMapper;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 

+ 3 - 3
yoshop-java/src/main/java/cn/yoshop/api/service/ApiGoodsService.java

@@ -29,9 +29,9 @@ import cn.yoshop.common.util.PhpStr;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiLogService.java

@@ -10,7 +10,7 @@ import cn.yoshop.common.page.PageVO;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiOrderCommentService.java

@@ -16,7 +16,7 @@ import cn.yoshop.common.mapper.OrderMapper;
 import cn.yoshop.store.service.UploadFileService;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/api/service/ApiOrderService.java

@@ -33,8 +33,8 @@ import cn.yoshop.store.service.UploadFileService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiRechargeService.java

@@ -21,7 +21,7 @@ import cn.yoshop.store.service.PaymentSettingService;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/api/service/ApiRefundService.java

@@ -23,7 +23,7 @@ import cn.yoshop.store.service.UploadFileService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -301,7 +301,7 @@ public class ApiRefundService {
         if (node.get("express") instanceof ObjectNode expressNode) {
             view.hide(expressNode, EXPRESS_HIDDEN);
         }
-        if (node.get("images") instanceof com.fasterxml.jackson.databind.node.ArrayNode images) {
+        if (node.get("images") instanceof tools.jackson.databind.node.ArrayNode images) {
             for (var item : images) {
                 if (item instanceof ObjectNode imageNode) {
                     if (imageNode.get("file") instanceof ObjectNode fileNode) {

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiSettingService.java

@@ -10,7 +10,7 @@ import cn.yoshop.store.service.ClientSettingService;
 import cn.yoshop.store.service.StoreInfoService;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiUserCouponService.java

@@ -14,7 +14,7 @@ import cn.yoshop.common.util.Params;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/api/service/ApiUserService.java

@@ -12,7 +12,7 @@ import cn.yoshop.common.util.Params;
 import cn.yoshop.store.service.MemberService;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

+ 3 - 3
yoshop-java/src/main/java/cn/yoshop/api/support/ApiView.java

@@ -1,8 +1,8 @@
 package cn.yoshop.api.support;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.ArrayNode;
+import tools.jackson.databind.node.ObjectNode;
 
 import org.springframework.stereotype.Component;
 

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/common/auth/AdminAuthInterceptor.java

@@ -2,7 +2,7 @@ package cn.yoshop.common.auth;
 
 import cn.yoshop.common.api.Status;
 import cn.yoshop.common.entity.AdminUser;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Value;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/auth/AdminTokenStore.java

@@ -2,8 +2,8 @@ package cn.yoshop.common.auth;
 
 import cn.yoshop.common.entity.AdminUser;
 import cn.yoshop.utils.RedisUtils;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/auth/RedisTokenStore.java

@@ -2,8 +2,8 @@ package cn.yoshop.common.auth;
 
 import cn.yoshop.common.entity.StoreUser;
 import cn.yoshop.utils.RedisUtils;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/common/auth/StoreAuthInterceptor.java

@@ -3,7 +3,7 @@ package cn.yoshop.common.auth;
 import cn.yoshop.common.api.Status;
 import cn.yoshop.common.entity.StoreUser;
 import cn.yoshop.common.web.StoreContext;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Value;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/Coupon.java

@@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDateTime;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/DeliveryRule.java

@@ -7,8 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import lombok.Data;
 

+ 4 - 4
yoshop-java/src/main/java/cn/yoshop/common/entity/Goods.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.baomidou.mybatisplus.extension.handlers.Jackson3TypeHandler;
 import cn.yoshop.common.api.Views;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonView;
@@ -13,8 +13,8 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import cn.yoshop.common.util.TimeUtil;
 import lombok.Data;
 
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -109,7 +109,7 @@ public class Goods {
     private Integer isIndDeliveryType;
 
     /** 配送方式,库内 JSON 数组字符串,如 [10] */
-    @TableField(typeHandler = JacksonTypeHandler.class)
+    @TableField(typeHandler = Jackson3TypeHandler.class)
     private List<Integer> deliveryType;
 
     /** 商品状态:10=上架 20=下架 */

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/GoodsSku.java

@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import cn.yoshop.common.util.PhpFloatSerializer;
 import cn.yoshop.common.util.TimeUtil;
 import lombok.Data;

+ 3 - 3
yoshop-java/src/main/java/cn/yoshop/common/entity/Order.java

@@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -133,7 +133,7 @@ public class Order {
     @com.baomidou.mybatisplus.annotation.TableField(exist = false)
     private List<OrderGoods> goods;
 
-    @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = cn.yoshop.common.util.UserLiteSerializer.class)
+    @tools.jackson.databind.annotation.JsonSerialize(using = cn.yoshop.common.util.UserLiteSerializer.class)
     @com.baomidou.mybatisplus.annotation.TableField(exist = false)
     private User user;
 

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/common/entity/OrderDelivery.java

@@ -54,7 +54,7 @@ public class OrderDelivery {
     @TableField(exist = false)
     @JsonInclude(JsonInclude.Include.NON_NULL)
     @JsonProperty("orderData")
-    private com.fasterxml.jackson.databind.JsonNode orderData;
+    private tools.jackson.databind.JsonNode orderData;
 
     /** 发货单商品(PHP with: goods.goods.image) */
     @TableField(exist = false)

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/OrderGoods.java

@@ -9,8 +9,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import lombok.Data;
 

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/OrderRefund.java

@@ -7,8 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import java.util.List;
 import lombok.Data;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/RechargeOrder.java

@@ -7,8 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.math.BigDecimal;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/RechargeOrderPlan.java

@@ -6,8 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.math.BigDecimal;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/RechargePlan.java

@@ -7,8 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import lombok.Data;
 

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/User.java

@@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.math.BigDecimal;

+ 3 - 3
yoshop-java/src/main/java/cn/yoshop/common/entity/UserBalanceLog.java

@@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import java.math.BigDecimal;
 import lombok.Data;
 
@@ -47,6 +47,6 @@ public class UserBalanceLog {
 
     /** 关联会员(含头像) */
     @TableField(exist = false)
-    @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = cn.yoshop.common.util.UserLiteSerializer.class)
+    @tools.jackson.databind.annotation.JsonSerialize(using = cn.yoshop.common.util.UserLiteSerializer.class)
     private User user;
 }

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/common/entity/UserCoupon.java

@@ -7,8 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import tools.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.math.BigDecimal;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/common/entity/UserPointsLog.java

@@ -36,7 +36,7 @@ public class UserPointsLog {
 
     /** 关联会员(含头像) */
     @TableField(exist = false)
-    @com.fasterxml.jackson.databind.annotation.JsonSerialize(using = cn.yoshop.common.util.UserLiteSerializer.class)
+    @tools.jackson.databind.annotation.JsonSerialize(using = cn.yoshop.common.util.UserLiteSerializer.class)
     private User user;
 
     @JsonProperty("createTime")

+ 10 - 7
yoshop-java/src/main/java/cn/yoshop/common/util/PhpFloatSerializer.java

@@ -1,20 +1,23 @@
 package cn.yoshop.common.util;
 
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import java.io.IOException;
+import tools.jackson.core.JacksonException;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
 
 /**
  * 对齐 PHP json_encode 对浮点的输出:PHP 不带 JSON_PRESERVE_ZERO_FRACTION 时,
  * 1.0 输出为 1,2.5 输出为 2.5;而 Java 的 Double 会输出 1.0。
  * 用于 goods_weight 这类库内为 double 的字段,避免前端对比出现 1.0 vs 1 的差异。
+ *
+ * <p>Jackson 3:{@code JsonSerializer} 更名 {@link ValueSerializer},
+ * 第三个参数由 {@code SerializerProvider} 换成 {@link SerializationContext},
+ * 异常改为非受检的 {@link JacksonException}。
  */
-public class PhpFloatSerializer extends JsonSerializer<Double> {
+public class PhpFloatSerializer extends ValueSerializer<Double> {
 
     @Override
-    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+    public void serialize(Double value, JsonGenerator gen, SerializationContext ctxt) throws JacksonException {
         if (value == null) {
             gen.writeNull();
             return;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/common/util/PhpStr.java

@@ -1,6 +1,6 @@
 package cn.yoshop.common.util;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
 
 /**
  * PHP 字符串 / JSON 函数等价实现。

+ 13 - 13
yoshop-java/src/main/java/cn/yoshop/common/util/UserLiteSerializer.java

@@ -1,29 +1,29 @@
 package cn.yoshop.common.util;
 
 import cn.yoshop.common.entity.User;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import java.io.IOException;
+import tools.jackson.core.JacksonException;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
+import tools.jackson.databind.json.JsonMapper;
+import tools.jackson.databind.node.ObjectNode;
 
 /**
  * 关联会员的精简序列化:订单、积分/余额流水里的 user 只加载了 avatar,
  * 输出时剔除 grade 键(PHP 端只有显式 with('grade') 才会出现该键)。
  *
  * <p>序列化用全局驼峰规则,与其它实体输出保持一致。
+ * <p>Jackson 3 的 mapper 不可变,独立实例改由 {@link JsonMapper#builder()} 构建
+ * (默认包含策略即 ALWAYS,无需再显式 setSerializationInclusion)。
  */
-public class UserLiteSerializer extends JsonSerializer<User> {
+public class UserLiteSerializer extends ValueSerializer<User> {
 
-    private static final ObjectMapper MAPPER = new ObjectMapper()
-            .setSerializationInclusion(JsonInclude.Include.ALWAYS);
+    private static final ObjectMapper MAPPER = JsonMapper.builder().build();
 
     @Override
-    public void serialize(User value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
+    public void serialize(User value, JsonGenerator gen, SerializationContext ctxt) throws JacksonException {
         if (value == null) {
             gen.writeNull();
             return;

+ 31 - 33
yoshop-java/src/main/java/cn/yoshop/config/RedisConfig.java

@@ -1,8 +1,5 @@
 package cn.yoshop.config;
 
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -12,7 +9,7 @@ import org.springframework.data.redis.cache.RedisCacheWriter;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.GenericJacksonJsonRedisSerializer;
 import org.springframework.data.redis.serializer.RedisSerializationContext;
 import org.springframework.data.redis.serializer.RedisSerializer;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
@@ -21,62 +18,63 @@ import java.net.UnknownHostException;
 import java.time.Duration;
 
 /**
- * Description:
+ * Redis 配置。
+ *
+ * <p>Spring Boot 4 / Jackson 3 迁移说明:Jackson 3 的 ObjectMapper 不可变,
+ * 原来的 {@code new ObjectMapper().setVisibility(..).enableDefaultTyping(..)} 写法已不可用;
+ * Spring Data Redis 4 对应提供 {@link GenericJacksonJsonRedisSerializer}(自带类型信息,
+ * 等价于 Jackson 2 的 GenericJackson2JsonRedisSerializer),由 builder 构建,不再手工配置 mapper。
  *
  * @author tanlie
- * Date: 2024/1/9 9:07
  */
 @EnableCaching
 @Configuration
 public class RedisConfig {
+
+    /**
+     * 带类型信息的 JSON 序列化器:反序列化能还原成原始类型(与原 enableDefaultTyping(NON_FINAL) 行为一致)。
+     * 仅用于内网 Redis、缓存内容由本服务写入,故沿用无白名单校验的 default typing。
+     */
+    static RedisSerializer<Object> jsonSerializer() {
+        return GenericJacksonJsonRedisSerializer.builder()
+                .enableUnsafeDefaultTyping()
+                .build();
+    }
+
     /**
      * 缓存管理器
-     *
-     * @param factory
-     * @return
      */
     @Bean
-    @SuppressWarnings("all")
     public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
-        ObjectMapper om = new ObjectMapper();
         RedisSerializer<String> redisSerializer = new StringRedisSerializer();
-        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
-        // 解决查询缓存转换异常的问题
-        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-        jackson2JsonRedisSerializer.setObjectMapper(om);
+        RedisSerializer<Object> valueSerializer = jsonSerializer();
         // 配置序列化(解决乱码的问题)
         RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                 .entryTtl(Duration.ofMillis(-1))
                 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
-                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer))
                 .disableCachingNullValues();
         RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory);
 
         return new RedisConfigCacheManager(cacheWriter, config);
     }
 
-    //重写template配置累
+    /** 通用 RedisTemplate(业务侧主要用 StringRedisTemplate,本 bean 供缓存/自定义场景) */
     @Bean
-    @SuppressWarnings("all")
     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) throws UnknownHostException {
 
-        RedisTemplate<String, Object> template = new RedisTemplate();
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
         template.setConnectionFactory(factory);
-        //json序列化
-        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
-        ObjectMapper om = new ObjectMapper();
-        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-        jackson2JsonRedisSerializer.setObjectMapper(om);
-        //String 序列化
+        // json 序列化
+        RedisSerializer<Object> valueSerializer = jsonSerializer();
+        // String 序列化
         StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
-        //key 采用string序列化
+        // key 采用 string 序列化
         template.setKeySerializer(stringRedisSerializer);
-        template.setHashKeySerializer(stringRedisSerializer);  //hash key也采用string
-        //value 采用json
-        template.setValueSerializer(jackson2JsonRedisSerializer);
-        template.setHashValueSerializer(jackson2JsonRedisSerializer);
+        template.setHashKeySerializer(stringRedisSerializer);  // hash key 也采用 string
+        // value 采用 json
+        template.setValueSerializer(valueSerializer);
+        template.setHashValueSerializer(valueSerializer);
 
         template.afterPropertiesSet();
         return template;
@@ -87,4 +85,4 @@ public class RedisConfig {
         return new StringRedisTemplate(factory);
     }
 
-}
+}

+ 1 - 2
yoshop-java/src/main/java/cn/yoshop/config/RedisConfigCacheManager.java

@@ -2,7 +2,6 @@ package cn.yoshop.config;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.cache.*;
-import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.RedisSerializationContext;
 
 import java.time.Duration;
@@ -22,7 +21,7 @@ public class RedisConfigCacheManager extends RedisCacheManager {
     }
 
     private static final RedisSerializationContext.SerializationPair<Object> DEFAULT_PAIR = RedisSerializationContext.SerializationPair
-            .fromSerializer(new GenericJackson2JsonRedisSerializer());
+            .fromSerializer(RedisConfig.jsonSerializer());
 
     /**
      * @param name

+ 3 - 3
yoshop-java/src/main/java/cn/yoshop/store/service/ClientSettingService.java

@@ -32,9 +32,9 @@ public class ClientSettingService {
     private final H5SettingMapper h5SettingMapper;
     private final WxappSettingMapper wxappSettingMapper;
 
-    private static final com.fasterxml.jackson.databind.ObjectMapper PHP_JSON =
-            com.fasterxml.jackson.databind.json.JsonMapper.builder()
-                    .enable(com.fasterxml.jackson.core.json.JsonWriteFeature.ESCAPE_NON_ASCII)
+    private static final tools.jackson.databind.ObjectMapper PHP_JSON =
+            tools.jackson.databind.json.JsonMapper.builder()
+                    .enable(tools.jackson.core.json.JsonWriteFeature.ESCAPE_NON_ASCII)
                     .build();
 
     // ---------------------------------------------------------------- H5 端

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/store/service/OrderDeliveryService.java

@@ -22,7 +22,7 @@ import cn.yoshop.common.util.PhpStr;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/store/service/OrderService.java

@@ -23,8 +23,8 @@ import cn.yoshop.common.util.TimeUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/store/service/PageDesignService.java

@@ -7,8 +7,8 @@ import cn.yoshop.common.util.PhpArray;
 import cn.yoshop.common.util.PhpStr;
 import cn.yoshop.common.util.TimeUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.ObjectMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.ClassPathResource;

+ 2 - 2
yoshop-java/src/main/java/cn/yoshop/store/service/PrinterService.java

@@ -10,8 +10,8 @@ import cn.yoshop.common.mapper.PrinterMapper;
 import cn.yoshop.common.mapper.StoreMapper;
 import cn.yoshop.common.util.PhpStr;
 import cn.yoshop.common.util.TimeUtil;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 1 - 1
yoshop-java/src/main/java/cn/yoshop/store/service/SettingService.java

@@ -89,7 +89,7 @@ public class SettingService {
 
     private String toJson(Object values) {
         try {
-            return new com.fasterxml.jackson.databind.ObjectMapper().writeValueAsString(values);
+            return new tools.jackson.databind.ObjectMapper().writeValueAsString(values);
         } catch (Exception e) {
             throw new BizException("设置内容格式不正确");
         }