diff --git a/pom.xml b/pom.xml index a2b7a662..5d6146e4 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.6 + 4.0.1 @@ -24,7 +24,8 @@ 9.1.0 1.2.24 - 3.5.5 + + 3.5.15 4.3.1 4.5.0 @@ -43,7 +44,8 @@ 3.16.3 - 3.51.0 + + 4.1.0 3.5.6 @@ -63,7 +65,8 @@ 2.14.5 - 1.1.2 + + 2.0.0-M1 @@ -121,9 +124,10 @@ spring-boot-starter-cache + org.springframework.boot - spring-boot-starter-aop + spring-boot-starter-aspectj @@ -154,9 +158,15 @@ ${druid.version} + com.baomidou - mybatis-plus-spring-boot3-starter + mybatis-plus-spring-boot4-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-jsqlparser ${mybatis-plus.version} diff --git a/src/main/java/com/youlai/boot/config/RedisCacheConfig.java b/src/main/java/com/youlai/boot/config/RedisCacheConfig.java index f1abe126..9be08f3c 100644 --- a/src/main/java/com/youlai/boot/config/RedisCacheConfig.java +++ b/src/main/java/com/youlai/boot/config/RedisCacheConfig.java @@ -1,7 +1,7 @@ package com.youlai.boot.config; -import org.springframework.boot.autoconfigure.cache.CacheProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.cache.autoconfigure.CacheProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/com/youlai/boot/config/WebMvcConfig.java b/src/main/java/com/youlai/boot/config/WebMvcConfig.java index a8082ea9..a2b6f572 100644 --- a/src/main/java/com/youlai/boot/config/WebMvcConfig.java +++ b/src/main/java/com/youlai/boot/config/WebMvcConfig.java @@ -1,12 +1,5 @@ package com.youlai.boot.config; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; @@ -15,16 +8,18 @@ import org.hibernate.validator.HibernateValidator; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverters; +import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; +import tools.jackson.databind.ser.std.ToStringSerializer; import java.math.BigInteger; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.List; import java.util.TimeZone; /** @@ -40,36 +35,27 @@ public class WebMvcConfig implements WebMvcConfigurer { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); /** - * 配置消息转换器 + * Spring Boot 4.x 已经使用Jackson 3.x + * Jackson 3.x已经自带JavaTimeModule,不再需要手工注册 * - * @param converters 消息转换器列表 + * @param converterBuilder the builder to configure */ @Override - public void configureMessageConverters(List> converters) { - MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); - ObjectMapper objectMapper = new ObjectMapper(); - - // 注册 JavaTimeModule(替代手动注册 LocalDateTimeSerializer) - JavaTimeModule javaTimeModule = new JavaTimeModule(); - // 返回指定字符串格式 - javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DATE_TIME_FORMATTER)); - // 反序列化,接受前端传来的格式 - javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DATE_TIME_FORMATTER)); - objectMapper.registerModule(javaTimeModule); + public void configureMessageConverters(HttpMessageConverters.ServerBuilder converterBuilder) { + JsonMapper.Builder builder = JsonMapper.builder(); // 配置全局日期格式和时区 - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); - objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8")); + builder.disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS); + builder.defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + builder.defaultTimeZone(TimeZone.getTimeZone("GMT+8")); // 处理 Long/BigInteger 的精度问题 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); - objectMapper.registerModule(simpleModule); + builder.addModule(simpleModule); - jackson2HttpMessageConverter.setObjectMapper(objectMapper); - converters.add(1, jackson2HttpMessageConverter); + converterBuilder.addCustomConverter(new JacksonJsonHttpMessageConverter(builder)); } /** diff --git a/src/main/java/com/youlai/boot/core/exception/GlobalExceptionHandler.java b/src/main/java/com/youlai/boot/core/exception/GlobalExceptionHandler.java index 9b20ddb9..26f39f7f 100644 --- a/src/main/java/com/youlai/boot/core/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/youlai/boot/core/exception/GlobalExceptionHandler.java @@ -1,7 +1,7 @@ package com.youlai.boot.core.exception; import cn.hutool.core.util.StrUtil; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import com.youlai.boot.core.web.Result; import com.youlai.boot.core.web.ResultCode; import jakarta.servlet.ServletException; @@ -143,11 +143,11 @@ public class GlobalExceptionHandler { /** * 处理 JSON 处理异常 *

- * 当处理 JSON 数据时发生错误,会抛出 JsonProcessingException 异常。 + * 当处理 JSON 数据时发生错误,会抛出 JacksonException 异常。 */ - @ExceptionHandler(JsonProcessingException.class) + @ExceptionHandler(JacksonException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) - public Result handleJsonProcessingException(JsonProcessingException e) { + public Result handleJacksonException(JacksonException e) { log.error("Json转换异常,异常原因:{}", e.getMessage(), e); return Result.failed(e.getMessage()); } diff --git a/src/main/java/com/youlai/boot/platform/websocket/publisher/WebSocketPublisher.java b/src/main/java/com/youlai/boot/platform/websocket/publisher/WebSocketPublisher.java index d6d04b7d..7d5f4d36 100644 --- a/src/main/java/com/youlai/boot/platform/websocket/publisher/WebSocketPublisher.java +++ b/src/main/java/com/youlai/boot/platform/websocket/publisher/WebSocketPublisher.java @@ -1,12 +1,12 @@ package com.youlai.boot.platform.websocket.publisher; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; @Service @RequiredArgsConstructor @@ -49,7 +49,7 @@ public class WebSocketPublisher { } } - private Object serializeIfNeeded(Object payload) throws JsonProcessingException { + private Object serializeIfNeeded(Object payload) throws JacksonException { if (payload == null) { return null; } diff --git a/src/main/java/com/youlai/boot/platform/websocket/service/impl/WebSocketServiceImpl.java b/src/main/java/com/youlai/boot/platform/websocket/service/impl/WebSocketServiceImpl.java index 3ac76600..46744240 100644 --- a/src/main/java/com/youlai/boot/platform/websocket/service/impl/WebSocketServiceImpl.java +++ b/src/main/java/com/youlai/boot/platform/websocket/service/impl/WebSocketServiceImpl.java @@ -13,7 +13,7 @@ import java.util.List; /** * WebSocket 服务实现类 - * + * * 核心功能: * - 用户在线状态管理(支持多设备登录) * - 消息推送(广播、点对点) @@ -145,7 +145,7 @@ public class WebSocketServiceImpl implements WebSocketService { /** * 手动触发在线用户数量广播 - * + * * 供外部服务(如定时任务)调用 */ public void notifyOnlineUsersChange() { diff --git a/src/main/java/com/youlai/boot/security/filter/CaptchaValidationFilter.java b/src/main/java/com/youlai/boot/security/filter/CaptchaValidationFilter.java index dc2137a8..0b4c7289 100644 --- a/src/main/java/com/youlai/boot/security/filter/CaptchaValidationFilter.java +++ b/src/main/java/com/youlai/boot/security/filter/CaptchaValidationFilter.java @@ -66,7 +66,7 @@ public class CaptchaValidationFilter extends OncePerRequestFilter { } // 包装请求,确保下游还能读取 body - ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request); + ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request, -1); byte[] bodyBytes = StreamUtils.copyToByteArray(requestWrapper.getInputStream()); String body = new String(bodyBytes, StandardCharsets.UTF_8); diff --git a/src/main/java/com/youlai/boot/security/model/SmsAuthenticationToken.java b/src/main/java/com/youlai/boot/security/model/SmsAuthenticationToken.java index d2aec807..2e575cf5 100644 --- a/src/main/java/com/youlai/boot/security/model/SmsAuthenticationToken.java +++ b/src/main/java/com/youlai/boot/security/model/SmsAuthenticationToken.java @@ -33,7 +33,7 @@ public class SmsAuthenticationToken extends AbstractAuthenticationToken { */ public SmsAuthenticationToken(Object principal, Object credentials) { // 没有授权信息时,设置为 null - super(null); + super((Collection) null); this.principal = principal; this.credentials = credentials; // 默认未认证 diff --git a/src/main/java/com/youlai/boot/security/model/WxMiniAppCodeAuthenticationToken.java b/src/main/java/com/youlai/boot/security/model/WxMiniAppCodeAuthenticationToken.java index 675e9db6..21b4d36f 100644 --- a/src/main/java/com/youlai/boot/security/model/WxMiniAppCodeAuthenticationToken.java +++ b/src/main/java/com/youlai/boot/security/model/WxMiniAppCodeAuthenticationToken.java @@ -24,7 +24,7 @@ public class WxMiniAppCodeAuthenticationToken extends AbstractAuthenticationToke */ public WxMiniAppCodeAuthenticationToken(Object principal) { // 没有授权信息时,设置为 null - super(null); + super((Collection) null); this.principal = principal; // 默认未认证 this.setAuthenticated(false); diff --git a/src/main/java/com/youlai/boot/security/model/WxMiniAppPhoneAuthenticationToken.java b/src/main/java/com/youlai/boot/security/model/WxMiniAppPhoneAuthenticationToken.java index 697e8941..c690e8b6 100644 --- a/src/main/java/com/youlai/boot/security/model/WxMiniAppPhoneAuthenticationToken.java +++ b/src/main/java/com/youlai/boot/security/model/WxMiniAppPhoneAuthenticationToken.java @@ -28,7 +28,7 @@ public class WxMiniAppPhoneAuthenticationToken extends AbstractAuthenticationTok * @param iv 初始向量 */ public WxMiniAppPhoneAuthenticationToken(String code, String encryptedData, String iv) { - super(null); + super((Collection) null); this.principal = code; this.encryptedData = encryptedData; this.iv = iv; diff --git a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java index 842ff185..4aba4eb3 100644 --- a/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java +++ b/src/main/java/com/youlai/boot/system/service/impl/MenuServiceImpl.java @@ -8,8 +8,8 @@ import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -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 com.youlai.boot.platform.codegen.model.entity.GenTable; import com.youlai.boot.security.util.SecurityUtils; import com.youlai.boot.system.converter.MenuConverter;