SpringBoot全局处理LocalDateTime返回格式和Long类型序列化

在spring Boot项目开发中,我们经常遇到后端是LocalDateTime类型或LocalDate类型,然后返回给前端格式不对的问题,以及后端是Long类型,但返回给前端Long的话出现精度丢失的问题,解决的方法可以给返回VO类中的字段一个一个加上注解,但是这样效率太低了,于是找到了一种全局处理的方法。

1.参考

SpringBoot–LocalDateTime–全局格式转换/前端入参/响应给前端_51CTO博客_springboot localdatetime

2.对Date类型做处理

先讲下,对于java.util.Date类型的统一处理:

在application.properties或application.yml文件中,你可以添加以下配置来设置日期格式:

#json格式化全局配置
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.serialization.write-dates-as-timestamps=false
spring:  
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false

3.对LocalDateTime和LocalDate做处理

但是,如果是 LocalDateTime类型或LocalDate类型 上面的配置并不会生效

参考SpringBoot–LocalDateTime–全局格式转换/前端入参/响应给前端_51CTO博客_springboot localdatetime

由于我项目中用到了 WebMvcConfig implements WebMvcConfigurer

所以用普通的 ObjectMapper+自定义序列化 或者 ackson2ObjectMapperBuilderCustomizer 会失效

最终采用 直接配置在 WebMvcConfig 类中实现

代码如下:

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 格式化 LocalDateTime 和 LocalDate
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // Create a Jackson2ObjectMapperBuilder to customize ObjectMapper
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.modules(new JavaTimeModule());

        // Customize LocalDateTime serialization
        builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        builder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

        // Configure converters with customized ObjectMapper
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }

    /**
     * 全局给Long类型加上@JsonSerialize(using = ToStringSerializer.class)
     * @param converters
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonConverter = (MappingJackson2HttpMessageConverter) converter;
                ObjectMapper objectMapper = jsonConverter.getObjectMapper();

                SimpleModule simpleModule = new SimpleModule();
                simpleModule.addSerializer(Long.class, new ToStringSerializer());

                objectMapper.registerModule(simpleModule);
            }
        }
    }
}

4.对Long类型做序列化处理

同理,如上面代码所示

5.最终效果

VO类

package com.znak.spmp.emergency.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.znak.spmp.file.dto.FileDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author xu yue
 * @date 2024/7/12
 * @Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EmergencyPlanVO {
    /**
     * id
     */
    @ApiModelProperty("id")
    private Long id;
    /**
     * 二级单位简称id
     */
    @ApiModelProperty("二级单位简称id")
    private Long orgShortNameId;

    /**
     * 二级单位简称
     */
    @ApiModelProperty("二级单位简称")
    private String orgShortName;
    /**
     * 单位id
     */
    @ApiModelProperty("单位id")
    private Long organizeId;

    /**
     * 单位名称
     */
    @ApiModelProperty("单位名称")
    private String organizeName;
    /**
     * 应对事故类型
     */
    @ApiModelProperty("应对事故类型")
    private List<String> riskAccidentsIds;
    /**
     * 预案备案标号
     */
    @ApiModelProperty("预案备案标号")
    private String registrationLabel;
    /**
     * 所属行业
     */
    @ApiModelProperty("所属行业")
    private String industry;
    /**
     * 预案名称
     */
    @ApiModelProperty("预案名称")
    private String name;
    /**
     * 发布日期
     */
    @ApiModelProperty("发布日期")
    private LocalDate publishDate;
    /**
     * 预案附件
     */
    @ApiModelProperty("预案附件")
    private List<FileDTO> files;
    /**
     * 是否备案(0否1是)
     */
    @ApiModelProperty("是否备案(0否1是)")
    private Integer register;
    /**
     * 备案形式(0内部(向集团内上级单位备案);1外部(向政府职能部门备案))
     */
    @ApiModelProperty("备案形式(0内部(向集团内上级单位备案);1外部(向政府职能部门备案))")
    private Integer registerType;
    /**
     * 备案内容
     */
    @ApiModelProperty("备案内容")
    private String registerContent;
    /**
     * 备案附件
     */
    @ApiModelProperty("备案附件")
    private List<FileDTO> registerFiles;
    /**
     * 备案部门
     */
    @ApiModelProperty("备案部门")
    private String registerDepartment;
    /**
     * 外部备案部门
     */
    @ApiModelProperty("外部备案部门")
    private String outsideRegisterDepartment;
    /**
     * 备案时间
     */
    @ApiModelProperty("备案时间")
    private LocalDate registerDate;
    /**
     * 场所id
     */
    @ApiModelProperty("场所id")
    private Long locationId;
    /**
     * 场所
     */
    @ApiModelProperty("场所")
    private String location;
    /**
     * 所属街道
     */
    @ApiModelProperty("所属街道")
    private String subStreet;
    /**
     * 应急预案类别(处置方案类别)
     */
    @ApiModelProperty("应急预案类别(处置方案类别)")
    private Long emergencyPlanTypeId;
    /**
     * 应急预案类别名(处置方案类别名)
     */
    @ApiModelProperty("应急预案类别名(处置方案类别名)")
    private String emergencyPlanType;

    /**
     * 创建人真实姓名
     */
    @ApiModelProperty("创建人真实姓名")
    private String createBy;

    /**
     * 创建时间
     */
    @ApiModelProperty("创建时间")
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @ApiModelProperty("更新时间")
    private LocalDateTime updateTime;
}

返回结果

在这里插入图片描述

相关推荐

  1. SpringBoot 统一后端返回格式处理全局异常

    2024-07-20 10:32:05       34 阅读
  2. 【Webflux】实现全局返回Long转String

    2024-07-20 10:32:05       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 10:32:05       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 10:32:05       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 10:32:05       45 阅读
  4. Python语言-面向对象

    2024-07-20 10:32:05       55 阅读

热门阅读

  1. RoCE(RDMA over Converged Ethernet)网络速率测试工具

    2024-07-20 10:32:05       15 阅读
  2. 读取 Excel 文件

    2024-07-20 10:32:05       14 阅读
  3. 实战:springboot用LocalDateTime快速替换Date

    2024-07-20 10:32:05       14 阅读
  4. Spark的部署模式

    2024-07-20 10:32:05       15 阅读
  5. Shell 构建flutter + Android 生成Apk

    2024-07-20 10:32:05       13 阅读
  6. 前端面试题日常练-day95 【Less】

    2024-07-20 10:32:05       14 阅读
  7. 前端TS习题

    2024-07-20 10:32:05       13 阅读
  8. 在SAP中,ME22N使用的BAPI是什么

    2024-07-20 10:32:05       18 阅读
  9. AI Native应用中的模型微调

    2024-07-20 10:32:05       18 阅读