springboot统⼀时间格式处理
之前我们做过关于,其实也就是把要显⽰的时间进⾏了处理,增强可读性。
但是增删改查功能中,LocalDateTime系列作为dto中时间的类型,
经常会报类似这样的错误:
Failed to convert from type [java.lang.String] to type [@io.swagger.annotations.ApiModelProperty java.time.LocalDateTime] for value '2021-03-16T00:00:00';
想解决这样的问题可以给实体类加⼊@DateTimeFormat(⽤于前台传递到后台)和@JsonFormat(后台传递到前台),但是这样就得给每个时间相关的属性,显然是治标不治本,也过于繁琐。
如果要彻底处理这个问题,就需要后台做好统⼀时间格式处理,根据类型做适当转换。
前台传递到后台时,将json中的String类型转化成后台需要的时间格式
后台传递到前台显⽰时,序列化过程中做好时间类型切换
这⾥以LocalDate/LocalDateTime为例,代码如下:
fig;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import org.apachemons.lang3.StringUtils;
import t.annotation.Bean;
import t.annotation.Configuration;
import verter.Converter;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
java时间日期格式转换import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
@Configuration
public class DateConfig {
/** 默认⽇期时间格式 */
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** 默认⽇期格式 */
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
/** 默认时间格式 */
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
/**
* 前端到后台 LocalDate转换器,⽤于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalDate> localDateConverter() {
return new Converter<>() {
@Override
public LocalDate convert(String source) {
if (StringUtils.isEmpty(source)) {
return null;
}
return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
}
};
}
/**
* 前端到后台 LocalDateTime转换器,⽤于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<>() {
@Override
public LocalDateTime convert(String source) {
if (StringUtils.isEmpty(source)) {
return null;
}
return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)); }
};
}
/**
* 前端到后台 LocalTime转换器,⽤于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalTime> localTimeConverter() {
return new Converter<>() {
@Override
public LocalTime convert(String source) {
if (StringUtils.isEmpty(source)) {
return null;
}
return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT));
}
};
}
/**
* 后台到前端 Json序列化转换器,⽤于对象序列化为返回响应的json
*/
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
// LocalDateTime系列序列化,继承⾃jsr310,我们在这⾥修改了⽇期格式
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addSerializer(LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
return objectMapper;
}
}
这样,vue前台就不需要再做处理,数据传递过来时就可以直接显⽰!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论