Răsfoiți Sursa

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

tanlie 11 ore în urmă
părinte
comite
804685ba8c
60 a modificat fișierele cu 351 adăugiri și 148 ștergeri
  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("设置内容格式不正确");
         }