mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 10:57:13 +08:00 
			
		
		
		
	修复:解决 Jackson2ObjectMapperBuilderCustomizer 配置不生效的问题,同时优化所有 Date 类型为对应 Java 8 日期、时间类型
This commit is contained in:
		| @@ -16,6 +16,8 @@ | |||||||
|  |  | ||||||
| package top.charles7c.cnadmin.common.config; | package top.charles7c.cnadmin.common.config; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
|  |  | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| @@ -23,6 +25,8 @@ import lombok.RequiredArgsConstructor; | |||||||
| import org.springframework.context.annotation.Bean; | import org.springframework.context.annotation.Bean; | ||||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||||
| import org.springframework.http.CacheControl; | import org.springframework.http.CacheControl; | ||||||
|  | import org.springframework.http.converter.HttpMessageConverter; | ||||||
|  | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | ||||||
| import org.springframework.web.cors.CorsConfiguration; | import org.springframework.web.cors.CorsConfiguration; | ||||||
| import org.springframework.web.cors.UrlBasedCorsConfigurationSource; | import org.springframework.web.cors.UrlBasedCorsConfigurationSource; | ||||||
| import org.springframework.web.filter.CorsFilter; | import org.springframework.web.filter.CorsFilter; | ||||||
| @@ -44,6 +48,7 @@ import top.charles7c.cnadmin.common.config.properties.CorsProperties; | |||||||
| public class WebMvcConfiguration implements WebMvcConfigurer { | public class WebMvcConfiguration implements WebMvcConfigurer { | ||||||
|  |  | ||||||
|     private final CorsProperties corsProperties; |     private final CorsProperties corsProperties; | ||||||
|  |     private final MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 静态资源处理器配置 |      * 静态资源处理器配置 | ||||||
| @@ -78,4 +83,20 @@ public class WebMvcConfiguration implements WebMvcConfigurer { | |||||||
|         source.registerCorsConfiguration("/**", config); |         source.registerCorsConfiguration("/**", config); | ||||||
|         return new CorsFilter(source); |         return new CorsFilter(source); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 解决 Jackson2ObjectMapperBuilderCustomizer 配置不生效的问题 | ||||||
|  |      * <p> | ||||||
|  |      * MappingJackson2HttpMessageConverter 对象在程序启动时创建了多个,移除多余的,保证只有一个 | ||||||
|  |      * </p> | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { | ||||||
|  |         converters.removeIf(MappingJackson2HttpMessageConverter.class::isInstance); | ||||||
|  |         if (Objects.isNull(mappingJackson2HttpMessageConverter)) { | ||||||
|  |             converters.add(0, new MappingJackson2HttpMessageConverter()); | ||||||
|  |         } else { | ||||||
|  |             converters.add(0, mappingJackson2HttpMessageConverter); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -22,7 +22,6 @@ import java.time.LocalDate; | |||||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||||
| import java.time.LocalTime; | import java.time.LocalTime; | ||||||
| import java.time.format.DateTimeFormatter; | import java.time.format.DateTimeFormatter; | ||||||
| import java.util.Locale; |  | ||||||
| import java.util.TimeZone; | import java.util.TimeZone; | ||||||
|  |  | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| @@ -60,11 +59,6 @@ public class JacksonConfiguration { | |||||||
|         String timeFormatPattern = "HH:mm:ss"; |         String timeFormatPattern = "HH:mm:ss"; | ||||||
|  |  | ||||||
|         return builder -> { |         return builder -> { | ||||||
|             // 针对 java.util.Date 的转换 |  | ||||||
|             builder.locale(Locale.CHINA); |  | ||||||
|             builder.timeZone(TimeZone.getDefault()); |  | ||||||
|             builder.simpleDateFormat(dateTimeFormatPattern); |  | ||||||
|  |  | ||||||
|             // 针对 Long、BigInteger、BigDecimal 的转换 |             // 针对 Long、BigInteger、BigDecimal 的转换 | ||||||
|             JavaTimeModule javaTimeModule = new JavaTimeModule(); |             JavaTimeModule javaTimeModule = new JavaTimeModule(); | ||||||
|             javaTimeModule.addSerializer(Long.class, BigNumberSerializer.SERIALIZER_INSTANCE); |             javaTimeModule.addSerializer(Long.class, BigNumberSerializer.SERIALIZER_INSTANCE); | ||||||
| @@ -85,6 +79,7 @@ public class JacksonConfiguration { | |||||||
|             javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter)); |             javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(timeFormatter)); | ||||||
|             javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter)); |             javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(timeFormatter)); | ||||||
|             builder.modules(javaTimeModule); |             builder.modules(javaTimeModule); | ||||||
|  |             builder.timeZone(TimeZone.getDefault()); | ||||||
|             log.info(">>>初始化 Jackson 配置<<<"); |             log.info(">>>初始化 Jackson 配置<<<"); | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| package top.charles7c.cnadmin.common.config.mybatis; | package top.charles7c.cnadmin.common.config.mybatis; | ||||||
|  |  | ||||||
| import java.util.Date; | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| import org.apache.ibatis.reflection.MetaObject; | import org.apache.ibatis.reflection.MetaObject; | ||||||
|  |  | ||||||
| @@ -59,7 +59,7 @@ public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             Long createUser = LoginHelper.getUserId(); |             Long createUser = LoginHelper.getUserId(); | ||||||
|             Date createTime = new Date(); |             LocalDateTime createTime = LocalDateTime.now(); | ||||||
|             if (metaObject.getOriginalObject() instanceof BaseEntity) { |             if (metaObject.getOriginalObject() instanceof BaseEntity) { | ||||||
|                 // 继承了 BaseEntity 的类,填充创建信息 |                 // 继承了 BaseEntity 的类,填充创建信息 | ||||||
|                 BaseEntity baseEntity = (BaseEntity)metaObject.getOriginalObject(); |                 BaseEntity baseEntity = (BaseEntity)metaObject.getOriginalObject(); | ||||||
| @@ -93,7 +93,7 @@ public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             Long updateUser = LoginHelper.getUserId(); |             Long updateUser = LoginHelper.getUserId(); | ||||||
|             Date updateTime = new Date(); |             LocalDateTime updateTime = LocalDateTime.now(); | ||||||
|             if (metaObject.getOriginalObject() instanceof BaseEntity) { |             if (metaObject.getOriginalObject() instanceof BaseEntity) { | ||||||
|                 // 继承了 BaseEntity 的类,填充修改信息 |                 // 继承了 BaseEntity 的类,填充修改信息 | ||||||
|                 BaseEntity baseEntity = (BaseEntity)metaObject.getOriginalObject(); |                 BaseEntity baseEntity = (BaseEntity)metaObject.getOriginalObject(); | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ | |||||||
| package top.charles7c.cnadmin.common.model.dto; | package top.charles7c.cnadmin.common.model.dto; | ||||||
|  |  | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| @@ -75,4 +76,14 @@ public class LoginUser implements Serializable { | |||||||
|      * 状态(1启用 2禁用) |      * 状态(1启用 2禁用) | ||||||
|      */ |      */ | ||||||
|     private Integer status; |     private Integer status; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 最后一次修改密码的时间 | ||||||
|  |      */ | ||||||
|  |     private LocalDateTime pwdResetTime; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     private LocalDateTime createTime; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| package top.charles7c.cnadmin.common.model.dto; | package top.charles7c.cnadmin.common.model.dto; | ||||||
|  |  | ||||||
| import java.util.Date; | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| @@ -37,7 +37,7 @@ public class OperationLog { | |||||||
|     /** |     /** | ||||||
|      * 操作时间 |      * 操作时间 | ||||||
|      */ |      */ | ||||||
|     private Date createTime; |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 异常 |      * 异常 | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ | |||||||
| package top.charles7c.cnadmin.common.model.entity; | package top.charles7c.cnadmin.common.model.entity; | ||||||
|  |  | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| import java.util.Date; | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| @@ -45,7 +45,7 @@ public class BaseEntity implements Serializable { | |||||||
|      * 创建时间 |      * 创建时间 | ||||||
|      */ |      */ | ||||||
|     @TableField(fill = FieldFill.INSERT) |     @TableField(fill = FieldFill.INSERT) | ||||||
|     private Date createTime; |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 修改人 |      * 修改人 | ||||||
| @@ -57,5 +57,5 @@ public class BaseEntity implements Serializable { | |||||||
|      * 修改时间 |      * 修改时间 | ||||||
|      */ |      */ | ||||||
|     @TableField(fill = FieldFill.INSERT_UPDATE) |     @TableField(fill = FieldFill.INSERT_UPDATE) | ||||||
|     private Date updateTime; |     private LocalDateTime updateTime; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -27,8 +27,6 @@ import io.swagger.v3.oas.annotations.media.Schema; | |||||||
|  |  | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
|  |  | ||||||
| import com.fasterxml.jackson.annotation.JsonFormat; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 响应信息 |  * 响应信息 | ||||||
|  * |  * | ||||||
| @@ -60,7 +58,6 @@ public class R<V extends Serializable> implements Serializable { | |||||||
|  |  | ||||||
|     /** 时间戳 */ |     /** 时间戳 */ | ||||||
|     @Schema(description = "时间戳") |     @Schema(description = "时间戳") | ||||||
|     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |  | ||||||
|     private LocalDateTime timestamp = LocalDateTime.now(); |     private LocalDateTime timestamp = LocalDateTime.now(); | ||||||
|  |  | ||||||
|     /** 成功状态码 */ |     /** 成功状态码 */ | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| package top.charles7c.cnadmin.monitor.interceptor; | package top.charles7c.cnadmin.monitor.interceptor; | ||||||
|  |  | ||||||
| import java.util.Date; | import java.time.LocalDateTime; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletRequest; | ||||||
| @@ -37,6 +37,7 @@ import org.springframework.web.util.ContentCachingResponseWrapper; | |||||||
| import org.springframework.web.util.WebUtils; | import org.springframework.web.util.WebUtils; | ||||||
|  |  | ||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
|  | import cn.hutool.core.date.LocalDateTimeUtil; | ||||||
| import cn.hutool.core.exceptions.ExceptionUtil; | import cn.hutool.core.exceptions.ExceptionUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.hutool.extra.servlet.ServletUtil; | import cn.hutool.extra.servlet.ServletUtil; | ||||||
| @@ -104,7 +105,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|     private void logCreateTime() { |     private void logCreateTime() { | ||||||
|         OperationLog operationLog = new OperationLog(); |         OperationLog operationLog = new OperationLog(); | ||||||
|         operationLog.setCreateUser(LoginHelper.getUserId()); |         operationLog.setCreateUser(LoginHelper.getUserId()); | ||||||
|         operationLog.setCreateTime(new Date()); |         operationLog.setCreateTime(LocalDateTime.now()); | ||||||
|         LogContextHolder.set(operationLog); |         LogContextHolder.set(operationLog); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -119,7 +120,7 @@ public class LogInterceptor implements HandlerInterceptor { | |||||||
|             LogContextHolder.remove(); |             LogContextHolder.remove(); | ||||||
|             SysLog sysLog = new SysLog(); |             SysLog sysLog = new SysLog(); | ||||||
|             sysLog.setCreateTime(operationLog.getCreateTime()); |             sysLog.setCreateTime(operationLog.getCreateTime()); | ||||||
|             sysLog.setElapsedTime(System.currentTimeMillis() - sysLog.getCreateTime().getTime()); |             sysLog.setElapsedTime(System.currentTimeMillis() - LocalDateTimeUtil.toEpochMilli(sysLog.getCreateTime())); | ||||||
|             sysLog.setLogLevel(LogLevelEnum.INFO); |             sysLog.setLogLevel(LogLevelEnum.INFO); | ||||||
|  |  | ||||||
|             // 记录异常信息 |             // 记录异常信息 | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ | |||||||
| package top.charles7c.cnadmin.monitor.model.entity; | package top.charles7c.cnadmin.monitor.model.entity; | ||||||
|  |  | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| import java.util.Date; | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| @@ -122,5 +122,5 @@ public class SysLog implements Serializable { | |||||||
|     /** |     /** | ||||||
|      * 操作时间 |      * 操作时间 | ||||||
|      */ |      */ | ||||||
|     private Date createTime; |     private LocalDateTime createTime; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ | |||||||
|  |  | ||||||
| package top.charles7c.cnadmin.system.model.entity; | package top.charles7c.cnadmin.system.model.entity; | ||||||
|  |  | ||||||
| import java.util.Date; | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  |  | ||||||
| @@ -91,5 +91,5 @@ public class SysUser extends BaseEntity { | |||||||
|     /** |     /** | ||||||
|      * 最后一次修改密码的时间 |      * 最后一次修改密码的时间 | ||||||
|      */ |      */ | ||||||
|     private Date pwdResetTime; |     private LocalDateTime pwdResetTime; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -173,7 +173,7 @@ spring: | |||||||
|   jackson: |   jackson: | ||||||
|     # 时区配置 |     # 时区配置 | ||||||
|     time-zone: GMT+8 |     time-zone: GMT+8 | ||||||
|     # 日期格式化 |     # 日期格式化(针对 java.util.Date) | ||||||
|     date-format: yyyy-MM-dd HH:mm:ss |     date-format: yyyy-MM-dd HH:mm:ss | ||||||
|     # 序列化配置(Bean -> JSON) |     # 序列化配置(Bean -> JSON) | ||||||
|     serialization: |     serialization: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user