在spring Boot项目开发中,我们经常遇到后端是LocalDateTime类型或LocalDate类型,然后返回给前端格式不对的问题,以及后端是Long类型,但返回给前端Long的话出现精度丢失的问题,解决的方法可以给返回VO类中的字段一个一个加上注解,但是这样效率太低了,于是找到了一种全局处理的方法。
1.参考
SpringBoot--LocalDateTime--全局格式转换/前端入参/响应给前端_51CTO博客_springboot localdatetime
2.对Date类型做处理
先讲下,对于java.util.Date类型的统一处理:
在application.properties或application.yml文件中,你可以添加以下配置来设置日期格式:
properties
#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
yml
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
类中实现
代码如下:
java
@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类
java
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;
}
返回结果