Commit b4ab90d8402ee42fe68e41aeb3ac6a0a91950a77

Authored by zhangmeiyang
1 parent 31863474

refactor(core): 升级Spring Boot至4.0.0并替换Jackson为Tools Jackson

- 将Spring Boot版本从3.5.7升级到4.0.0
- 替换com.fasterxml.jackson依赖为tools.jackson
- 更新MyBatis Plus starter为spring-boot4-starter版本
- 修改JsonUtils工具类以适配新的Jackson包路径
- 更新全局异常处理器中的异常类型引用
- 调整相关模块的依赖配置和导入语句
- 升级MyBatis Plus版本至3.5.15
- 更新阿里云Spring Cloud版本至2025.0.0.0
... ... @@ -27,11 +27,11 @@
27 27 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
28 28 <!-- Spring相关版本 -->
29 29 <spring-cloud.version>2025.0.0</spring-cloud.version>
30   - <spring-boot.version>3.5.7</spring-boot.version>
31   - <alibaba.cloud.version>2023.0.3.4</alibaba.cloud.version>
  30 + <spring-boot.version>4.0.0</spring-boot.version>
  31 + <alibaba.cloud.version>2025.0.0.0</alibaba.cloud.version>
32 32 <!-- 数据库相关 -->
33 33 <mysql-connector.version>9.4.0</mysql-connector.version>
34   - <mybatis-plus.version>3.5.14</mybatis-plus.version>
  34 + <mybatis-plus.version>3.5.15</mybatis-plus.version>
35 35 <!-- 工具类库 -->
36 36 <lombok.version>1.18.42</lombok.version>
37 37 <poi.version>5.5.0</poi.version>
... ... @@ -41,7 +41,7 @@
41 41 <dependencies>
42 42 <dependency>
43 43 <groupId>com.baomidou</groupId>
44   - <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  44 + <artifactId>mybatis-plus-spring-boot4-starter</artifactId>
45 45 <version>${mybatis-plus.version}</version>
46 46 </dependency>
47 47 <dependency>
... ...
tax-adopt/src/main/java/com/diligrp/tax/adopt/service/impl/AdoptMessageServiceImpl.java
... ... @@ -14,7 +14,7 @@ import com.diligrp.tax.central.service.ITenantService;
14 14 import com.diligrp.tax.central.type.TaxSystemType;
15 15 import com.diligrp.tax.central.utils.AdoptUtils;
16 16 import com.diligrp.tax.central.utils.JsonUtils;
17   -import com.fasterxml.jackson.core.type.TypeReference;
  17 +
18 18 import lombok.AllArgsConstructor;
19 19 import lombok.extern.slf4j.Slf4j;
20 20 import org.apache.commons.io.FilenameUtils;
... ... @@ -24,6 +24,7 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
24 24 import org.springframework.stereotype.Service;
25 25 import org.springframework.util.CollectionUtils;
26 26 import org.springframework.web.multipart.MultipartFile;
  27 +import tools.jackson.core.type.TypeReference;
27 28  
28 29 import java.io.IOException;
29 30 import java.util.List;
... ...
tax-central/src/main/java/com/diligrp/tax/central/config/GlobalExceptionHandler.java
... ... @@ -3,7 +3,6 @@ package com.diligrp.tax.central.config;
3 3 import com.diligrp.tax.central.exception.TaxAgentServiceException;
4 4 import com.diligrp.tax.central.message.Message;
5 5 import com.diligrp.tax.central.type.TaxSystemType;
6   -import com.fasterxml.jackson.databind.exc.InvalidFormatException;
7 6 import jakarta.validation.ConstraintViolation;
8 7 import jakarta.validation.ConstraintViolationException;
9 8 import lombok.extern.slf4j.Slf4j;
... ... @@ -16,6 +15,7 @@ import org.springframework.web.bind.MethodArgumentNotValidException;
16 15 import org.springframework.web.bind.MissingServletRequestParameterException;
17 16 import org.springframework.web.bind.annotation.ExceptionHandler;
18 17 import org.springframework.web.bind.annotation.RestControllerAdvice;
  18 +import tools.jackson.core.JacksonException;
19 19  
20 20 import java.util.List;
21 21 import java.util.Set;
... ... @@ -42,7 +42,7 @@ public class GlobalExceptionHandler {
42 42 * @param ex InvalidFormatException
43 43 * @return 响应消息对象
44 44 */
45   - @ExceptionHandler({HttpMessageNotReadableException.class, InvalidFormatException.class})
  45 + @ExceptionHandler({HttpMessageNotReadableException.class, JacksonException.class})
46 46 public Message<?> invalidFormatExceptionHandler(Exception ex) {
47 47 return Message.failure(TaxSystemType.ABNORMAL_PARAMETERS.code, ex.getMessage());
48 48 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/type/DocumentFieldType.java
... ... @@ -3,7 +3,7 @@ package com.diligrp.tax.central.type;
3 3 import com.diligrp.tax.central.model.PipelineBusinessKeywordDO;
4 4 import com.diligrp.tax.central.utils.JsonPathUtils;
5 5 import com.diligrp.tax.central.utils.JsonUtils;
6   -import com.fasterxml.jackson.core.type.TypeReference;
  6 +import tools.jackson.core.type.TypeReference;
7 7  
8 8 import java.util.*;
9 9  
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/JsonPathUtils.java
... ... @@ -2,8 +2,8 @@ package com.diligrp.tax.central.utils;
2 2  
3 3 import com.diligrp.tax.central.exception.TaxAgentServiceException;
4 4 import com.diligrp.tax.central.type.TaxSystemType;
5   -import com.fasterxml.jackson.core.type.TypeReference;
6 5 import com.jayway.jsonpath.JsonPath;
  6 +import tools.jackson.core.type.TypeReference;
7 7  
8 8 import java.util.HashMap;
9 9 import java.util.Map;
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/JsonUtils.java
1 1 package com.diligrp.tax.central.utils;
2 2  
3 3 import com.fasterxml.jackson.annotation.JsonInclude;
4   -import com.fasterxml.jackson.core.JsonProcessingException;
5   -import com.fasterxml.jackson.core.type.TypeReference;
6   -import com.fasterxml.jackson.databind.DeserializationFeature;
7   -import com.fasterxml.jackson.databind.JavaType;
8   -import com.fasterxml.jackson.databind.ObjectMapper;
9   -import com.fasterxml.jackson.databind.SerializationFeature;
10   -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
11   -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
12   -import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
13   -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
14   -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
15   -import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
16   -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
  4 +import tools.jackson.core.JacksonException;
  5 +import tools.jackson.databind.DeserializationFeature;
  6 +import tools.jackson.databind.SerializationFeature;
  7 +import tools.jackson.databind.cfg.DateTimeFeature;
  8 +import tools.jackson.databind.cfg.EnumFeature;
  9 +import tools.jackson.databind.ext.javatime.deser.LocalDateDeserializer;
  10 +import tools.jackson.databind.ext.javatime.deser.LocalDateTimeDeserializer;
  11 +import tools.jackson.databind.ext.javatime.deser.LocalTimeDeserializer;
  12 +import tools.jackson.databind.ext.javatime.ser.LocalDateSerializer;
  13 +import tools.jackson.databind.ext.javatime.ser.LocalDateTimeSerializer;
  14 +import tools.jackson.databind.ext.javatime.ser.LocalTimeSerializer;
  15 +import tools.jackson.databind.json.JsonMapper;
  16 +import tools.jackson.databind.module.SimpleModule;
17 17  
18 18 import java.text.SimpleDateFormat;
19 19 import java.time.LocalDate;
... ... @@ -24,100 +24,109 @@ import java.time.format.DateTimeFormatter;
24 24 import java.util.TimeZone;
25 25  
26 26 public class JsonUtils {
27   -
28 27 private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
29 28  
30 29 private static final String DATE_FORMAT = "yyyy-MM-dd";
31 30  
32 31 private static final String TIME_FORMAT = "HH:mm:ss";
33 32  
34   - private static final ObjectMapper objectMapper = initObjectMapper();
35   -
36   - private static ObjectMapper initObjectMapper() {
37   - Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder = new Jackson2ObjectMapperBuilder();
38   - initObjectMapperBuilder(jackson2ObjectMapperBuilder);
39   - ObjectMapper objectMapper = jackson2ObjectMapperBuilder.createXmlMapper(false).build();
40   - objectMapper.setSerializerFactory(objectMapper.getSerializerFactory());
41   - return objectMapper;
42   - }
43 33  
44   - public static void initObjectMapperBuilder(Jackson2ObjectMapperBuilder builder) {
45   - //序列化java.util.Date类型
46   - builder.dateFormat(new SimpleDateFormat(DATE_TIME_FORMAT));
47   - builder.timeZone(TimeZone.getTimeZone(ZoneOffset.of("+8")));
48   - builder.serializationInclusion(JsonInclude.Include.NON_NULL);
49   - builder.featuresToDisable(
50   - DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, // Json串的属性无JavaBean字段对应时,避免抛出异常
51   - DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, // JavaBean中primitive类型的字段无Json属性时,避免抛出异常
52   - DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, // Json串数字类型属性,赋值JavaBean中Enum字段时,避免抛出异常
53   - SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
54   - SerializationFeature.FAIL_ON_EMPTY_BEANS
55   - );
56   - builder.featuresToEnable(
57   - DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,
58   - DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY
59   - );
  34 + private static final JsonMapper MAPPER = initJacksonMapper();
60 35  
  36 + private static JsonMapper initJacksonMapper() {
61 37 var dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT);
62 38 var dateFormatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
63 39 var timeFormatter = DateTimeFormatter.ofPattern(TIME_FORMAT);
64   - // 添加自定义序列化
65   - builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));
66   - builder.serializerByType(LocalDate.class, new LocalDateSerializer(dateFormatter));
67   - builder.serializerByType(LocalTime.class, new LocalTimeSerializer(timeFormatter));
68   - // 添加自定义反序列化
69   - builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter));
70   - builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(dateFormatter));
71   - builder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(timeFormatter));
  40 + LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(dateTimeFormatter);
  41 + LocalDateSerializer localDateSerializer = new LocalDateSerializer(dateFormatter);
  42 + LocalTimeSerializer localTimeSerializer = new LocalTimeSerializer(timeFormatter);
  43 +
  44 + LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(dateTimeFormatter);
  45 + LocalDateDeserializer localDateDeserializer = new LocalDateDeserializer(dateFormatter);
  46 + LocalTimeDeserializer localTimeDeserializer = new LocalTimeDeserializer(timeFormatter);
  47 +
  48 + SimpleModule module = new SimpleModule();
  49 + module.addSerializer(LocalDateTime.class, localDateTimeSerializer);
  50 + module.addSerializer(LocalDate.class, localDateSerializer);
  51 + module.addSerializer(LocalTime.class, localTimeSerializer);
  52 + module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
  53 + module.addDeserializer(LocalDate.class, localDateDeserializer);
  54 + module.addDeserializer(LocalTime.class, localTimeDeserializer);
  55 + return JsonMapper.builder()
  56 + .changeDefaultPropertyInclusion(incl -> incl.withValueInclusion(JsonInclude.Include.NON_NULL))
  57 + .changeDefaultPropertyInclusion(incl -> incl.withContentInclusion(JsonInclude.Include.NON_NULL))
  58 + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
  59 + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
  60 + .disable(EnumFeature.FAIL_ON_NUMBERS_FOR_ENUMS)
  61 + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS)
  62 + .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
  63 + .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT)
  64 + .enable(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY)
  65 + .defaultDateFormat(new SimpleDateFormat(DATE_TIME_FORMAT))
  66 + .defaultTimeZone(TimeZone.getTimeZone(ZoneOffset.of("+8")))
  67 + .addModule(module)
  68 + .build();
  69 +
72 70 }
73 71  
74 72 public static <T> T fromJsonString(String json, Class<T> type) {
75 73 try {
76   - return objectMapper.readValue(json, type);
77   - } catch (JsonProcessingException ex) {
  74 + return MAPPER.readValue(json, type);
  75 + } catch (JacksonException ex) {
78 76 throw new IllegalArgumentException("Deserialize json exception", ex);
79 77 }
80 78 }
81 79  
82   - public static <T> T fromJsonString(String json, TypeReference<T> jsonTypeReference) {
  80 + public static <T> T fromJsonString(String json, tools.jackson.core.type.TypeReference<T> jsonTypeReference) {
83 81 try {
84   - return objectMapper.readValue(json, jsonTypeReference);
85   - } catch (JsonProcessingException ex) {
  82 + return MAPPER.readValue(json, jsonTypeReference);
  83 + } catch (JacksonException ex) {
86 84 throw new IllegalArgumentException("Deserialize json array exception", ex);
87 85 }
88 86 }
89 87  
90   - public static <T> T fromJsonString(String json, JavaType javaType) {
  88 + public static <T> T fromJsonString(String json, tools.jackson.databind.JavaType javaType) {
91 89 try {
92   - return objectMapper.readValue(json, javaType);
93   - } catch (JsonProcessingException ex) {
  90 + return MAPPER.readValue(json, javaType);
  91 + } catch (JacksonException ex) {
94 92 throw new IllegalArgumentException("Deserialize json array exception", ex);
95 93 }
96 94 }
97 95  
98 96 public static <T> String toJsonString(T object) {
99 97 try {
100   - return objectMapper.writeValueAsString(object);
101   - } catch (JsonProcessingException ex) {
  98 + return MAPPER.writeValueAsString(object);
  99 + } catch (JacksonException ex) {
102 100 throw new IllegalArgumentException("Serialize json exception", ex);
103 101 }
104 102 }
105 103  
106 104 public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
107   - return objectMapper.convertValue(fromValue, toValueType);
  105 + try {
  106 + return MAPPER.convertValue(fromValue, toValueType);
  107 + } catch (JacksonException ex) {
  108 + throw new IllegalArgumentException("Convert value exception", ex);
  109 + }
108 110 }
109 111  
110   - public static <T> T convertValue(Object fromValue, TypeReference<T> toValueTypeRef) {
111   - return objectMapper.convertValue(fromValue, toValueTypeRef);
  112 + public static <T> T convertValue(Object fromValue, tools.jackson.core.type.TypeReference<T> toValueTypeRef) {
  113 + try {
  114 + return MAPPER.convertValue(fromValue, toValueTypeRef);
  115 + } catch (JacksonException ex) {
  116 + throw new IllegalArgumentException("Convert value exception", ex);
  117 + }
112 118 }
113 119  
114   - public static <T> T convertValue(Object fromValue, JavaType toValueType) {
115   - return objectMapper.convertValue(fromValue, toValueType);
  120 + public static <T> T convertValue(Object fromValue, tools.jackson.databind.JavaType toValueType) {
  121 + try {
  122 + return MAPPER.convertValue(fromValue, toValueType);
  123 + } catch (JacksonException ex) {
  124 + throw new IllegalArgumentException("Convert value exception", ex);
  125 + }
116 126 }
117 127  
118 128 public static <T> T deepCopy(T t, Class<T> cls) {
119 129 return JsonUtils.fromJsonString(JsonUtils.toJsonString(t), cls);
120 130 }
121 131  
122   -
123 132 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/MappingUtils.java
... ... @@ -11,8 +11,8 @@ import com.diligrp.tax.central.exception.TaxAgentServiceException;
11 11 import com.diligrp.tax.central.model.PipelineDocFieldTypeDO;
12 12 import com.diligrp.tax.central.model.PipelineDocFieldTypeRemoteParamDO;
13 13 import com.diligrp.tax.central.type.TaxSystemType;
14   -import com.fasterxml.jackson.core.type.TypeReference;
15 14 import lombok.extern.slf4j.Slf4j;
  15 +import tools.jackson.core.type.TypeReference;
16 16  
17 17 import java.lang.reflect.Field;
18 18 import java.util.*;
... ...
tax-map/src/main/java/com/diligrp/tax/mapping/process/kingdee/MappingProcessor.java
... ... @@ -6,11 +6,10 @@ import com.diligrp.tax.central.process.AbstractProcessor;
6 6 import com.diligrp.tax.central.utils.JsonUtils;
7 7 import com.diligrp.tax.mapping.context.MappingContext;
8 8 import com.diligrp.tax.mapping.demarcate.Transformer;
9   -import com.fasterxml.jackson.core.type.TypeReference;
10 9 import lombok.extern.slf4j.Slf4j;
11 10 import org.springframework.core.annotation.Order;
12 11 import org.springframework.stereotype.Component;
13   -
  12 +import tools.jackson.core.type.TypeReference;
14 13 import java.util.Map;
15 14  
16 15 /**
... ...
tax-proxy/src/main/java/com/diligrp/tax/proxy/demarcate/kingdee/CustomerSender.java
... ... @@ -11,12 +11,13 @@ import com.diligrp.tax.central.type.TaxSystemType;
11 11 import com.diligrp.tax.central.utils.JsonUtils;
12 12 import com.diligrp.tax.proxy.demarcate.Sender;
13 13 import com.diligrp.tax.proxy.helper.KingDeeHelper;
14   -import com.fasterxml.jackson.core.type.TypeReference;
  14 +
15 15 import com.kingdee.bos.webapi.entity.IdentifyInfo;
16 16 import com.kingdee.bos.webapi.entity.RepoRet;
17 17 import com.kingdee.bos.webapi.entity.SuccessEntity;
18 18 import com.kingdee.bos.webapi.sdk.K3CloudApi;
19 19 import org.springframework.stereotype.Component;
  20 +import tools.jackson.core.type.TypeReference;
20 21  
21 22 import java.util.ArrayList;
22 23 import java.util.List;
... ...
tax-proxy/src/main/java/com/diligrp/tax/proxy/helper/KingDeeHelper.java
... ... @@ -6,7 +6,6 @@ import com.diligrp.tax.central.type.TaxSystemType;
6 6 import com.diligrp.tax.central.utils.JsonUtils;
7 7 import com.diligrp.tax.proxy.message.KingDeeQuery;
8 8 import com.diligrp.tax.proxy.message.KingDeeSubmit;
9   -import com.fasterxml.jackson.core.type.TypeReference;
10 9 import com.google.gson.Gson;
11 10 import com.kingdee.bos.webapi.entity.IdentifyInfo;
12 11 import com.kingdee.bos.webapi.entity.OperateParam;
... ... @@ -14,6 +13,7 @@ import com.kingdee.bos.webapi.entity.RepoError;
14 13 import com.kingdee.bos.webapi.entity.RepoRet;
15 14 import com.kingdee.bos.webapi.sdk.K3CloudApi;
16 15 import lombok.extern.slf4j.Slf4j;
  16 +import tools.jackson.core.type.TypeReference;
17 17  
18 18 import java.util.Collections;
19 19 import java.util.List;
... ...
tax-storage/pom.xml
... ... @@ -23,7 +23,7 @@
23 23 </dependency>
24 24 <dependency>
25 25 <groupId>com.baomidou</groupId>
26   - <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  26 + <artifactId>mybatis-plus-spring-boot4-starter</artifactId>
27 27 </dependency>
28 28 <dependency>
29 29 <groupId>com.baomidou</groupId>
... ... @@ -31,7 +31,7 @@
31 31 </dependency>
32 32 <dependency>
33 33 <groupId>org.springframework.boot</groupId>
34   - <artifactId>spring-boot-starter-aop</artifactId>
  34 + <artifactId>spring-boot-starter-aspectj</artifactId>
35 35 </dependency>
36 36 </dependencies>
37 37 </project>
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/service/MappingErrorService.java
... ... @@ -13,11 +13,11 @@ import com.diligrp.tax.storage.domain.MappingError;
13 13 import com.diligrp.tax.storage.model.co.MappingErrorCO;
14 14 import com.diligrp.tax.storage.model.vo.MappingErrorVO;
15 15 import com.diligrp.tax.storage.repo.MappingErrorRepository;
16   -import com.fasterxml.jackson.core.type.TypeReference;
17 16 import jakarta.annotation.Resource;
18 17 import org.springframework.amqp.rabbit.core.RabbitTemplate;
19 18 import org.springframework.stereotype.Service;
20 19 import org.springframework.transaction.annotation.Transactional;
  20 +import tools.jackson.core.type.TypeReference;
21 21  
22 22 import static com.diligrp.tax.central.queue.TaxAutoPush.NORMAL_EXCHANGE;
23 23 import static com.diligrp.tax.central.queue.TaxAutoPush.NORMAL_ROUTING;
... ...