0


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@EnableWebMvcpublicclassWebMvcConfigimplementsWebMvcConfigurer{/**
     * 格式化 LocalDateTime 和 LocalDate
     * @param converters
     */@OverridepublicvoidconfigureMessageConverters(List<HttpMessageConverter<?>> converters){// Create a Jackson2ObjectMapperBuilder to customize ObjectMapperJackson2ObjectMapperBuilder builder =newJackson2ObjectMapperBuilder();
        builder.modules(newJavaTimeModule());// Customize LocalDateTime serialization
        builder.serializerByType(LocalDateTime.class,newLocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        builder.serializerByType(LocalDate.class,newLocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));// Configure converters with customized ObjectMapper
        converters.add(newMappingJackson2HttpMessageConverter(builder.build()));}/**
     * 全局给Long类型加上@JsonSerialize(using = ToStringSerializer.class)
     * @param converters
     */@OverridepublicvoidextendMessageConverters(List<HttpMessageConverter<?>> converters){for(HttpMessageConverter<?> converter : converters){if(converter instanceofMappingJackson2HttpMessageConverter){MappingJackson2HttpMessageConverter jsonConverter =(MappingJackson2HttpMessageConverter) converter;ObjectMapper objectMapper = jsonConverter.getObjectMapper();SimpleModule simpleModule =newSimpleModule();
                simpleModule.addSerializer(Long.class,newToStringSerializer());

                objectMapper.registerModule(simpleModule);}}}}

这里注意当get请求的接口,使用了@ApiParam注解时,会失效,使用@RequestParam则不会,暂时没找到原因和解决方案

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

同理,如上面代码所示

5.最终效果

VO类

packagecom.znak.spmp.emergency.vo;importcom.fasterxml.jackson.annotation.JsonFormat;importcom.fasterxml.jackson.databind.annotation.JsonSerialize;importcom.fasterxml.jackson.databind.ser.std.ToStringSerializer;importcom.znak.spmp.file.dto.FileDTO;importio.swagger.annotations.ApiModelProperty;importlombok.AllArgsConstructor;importlombok.Builder;importlombok.Data;importlombok.NoArgsConstructor;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.util.List;/**
 * @author xu yue
 * @date 2024/7/12
 * @Description
 */@Data@AllArgsConstructor@NoArgsConstructor@BuilderpublicclassEmergencyPlanVO{/**
     * id
     */@ApiModelProperty("id")privateLong id;/**
     * 二级单位简称id
     */@ApiModelProperty("二级单位简称id")privateLong orgShortNameId;/**
     * 二级单位简称
     */@ApiModelProperty("二级单位简称")privateString orgShortName;/**
     * 单位id
     */@ApiModelProperty("单位id")privateLong organizeId;/**
     * 单位名称
     */@ApiModelProperty("单位名称")privateString organizeName;/**
     * 应对事故类型
     */@ApiModelProperty("应对事故类型")privateList<String> riskAccidentsIds;/**
     * 预案备案标号
     */@ApiModelProperty("预案备案标号")privateString registrationLabel;/**
     * 所属行业
     */@ApiModelProperty("所属行业")privateString industry;/**
     * 预案名称
     */@ApiModelProperty("预案名称")privateString name;/**
     * 发布日期
     */@ApiModelProperty("发布日期")privateLocalDate publishDate;/**
     * 预案附件
     */@ApiModelProperty("预案附件")privateList<FileDTO> files;/**
     * 是否备案(0否1是)
     */@ApiModelProperty("是否备案(0否1是)")privateInteger register;/**
     * 备案形式(0内部(向集团内上级单位备案);1外部(向政府职能部门备案))
     */@ApiModelProperty("备案形式(0内部(向集团内上级单位备案);1外部(向政府职能部门备案))")privateInteger registerType;/**
     * 备案内容
     */@ApiModelProperty("备案内容")privateString registerContent;/**
     * 备案附件
     */@ApiModelProperty("备案附件")privateList<FileDTO> registerFiles;/**
     * 备案部门
     */@ApiModelProperty("备案部门")privateString registerDepartment;/**
     * 外部备案部门
     */@ApiModelProperty("外部备案部门")privateString outsideRegisterDepartment;/**
     * 备案时间
     */@ApiModelProperty("备案时间")privateLocalDate registerDate;/**
     * 场所id
     */@ApiModelProperty("场所id")privateLong locationId;/**
     * 场所
     */@ApiModelProperty("场所")privateString location;/**
     * 所属街道
     */@ApiModelProperty("所属街道")privateString subStreet;/**
     * 应急预案类别(处置方案类别)
     */@ApiModelProperty("应急预案类别(处置方案类别)")privateLong emergencyPlanTypeId;/**
     * 应急预案类别名(处置方案类别名)
     */@ApiModelProperty("应急预案类别名(处置方案类别名)")privateString emergencyPlanType;/**
     * 创建人真实姓名
     */@ApiModelProperty("创建人真实姓名")privateString createBy;/**
     * 创建时间
     */@ApiModelProperty("创建时间")privateLocalDateTime createTime;/**
     * 更新时间
     */@ApiModelProperty("更新时间")privateLocalDateTime updateTime;}

返回结果

在这里插入图片描述

标签: java 笔记 spring boot

本文转载自: https://blog.csdn.net/m0_52620144/article/details/140543126
版权归原作者 NEIL_XU_ 所有, 如有侵权,请联系我们删除。

“SpringBoot全局处理LocalDateTime返回格式和Long类型序列化”的评论:

还没有评论