springboot默认不支持请求参数解析为jdk1.8中日期时间类型,下面提供两种方式解析实现请求入参解析为LocalDate、LocalDateTime 、LocalTime等。
方式一:全局配置
通过以下配置可以对所有请求入参LocalDate、LocalDateTime 、LocalTime类型做统一的格式转换。
private LocalDateTimeSerializer localDateTimeSerializer() {
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DateFormatConstant.DATE_TIME_FORMAT_1));
}
private LocalDateTimeDeserializer localDateTimeDeserializer() {
return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DateFormatConstant.DATE_TIME_FORMAT_1));
}
private LocalDateSerializer localDateSerializer() {
return new LocalDateSerializer(DateTimeFormatter.ofPattern(DateFormatConstant.DATE_FORMAT_3));
}
private LocalDateDeserializer localDateDeserializer() {
return new LocalDateDeserializer(DateTimeFormatter.ofPattern(DateFormatConstant.DATE_FORMAT_3));
}
private LocalTimeSerializer localTimeSerializer() {
return new LocalTimeSerializer(DateTimeFormatter.ofPattern(DateFormatConstant.TIME_FORMAT_1));
}
private LocalTimeDeserializer localTimeDeserializer() {
return new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DateFormatConstant.TIME_FORMAT_1));
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> {
builder.serializerByType(LocalDateTime.class, localDateTimeSerializer());
builder.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());
builder.serializerByType(LocalDate.class, localDateSerializer());
builder.deserializerByType(LocalDate.class, localDateDeserializer());
builder.serializerByType(LocalTime.class, localTimeSerializer());
builder.deserializerByType(LocalTime.class, localTimeDeserializer());
};
}
方式二:局部设置一
在属性上添加JsonFormat注解,实现对属性解析的精确配置。
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateFormatConstant.DATE_FORMAT_2)
private LocalDate date;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DateFormatConstant.DATE_TIME_FORMAT_1)
private LocalDateTime dateTime;
或使用JsonFormat注解与JsonDeserialize及JsonSerialize注解配合,指定相应的解析类。
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
@JsonFormat(pattern = DateFormatConstant.DATE_FORMAT_5)
private LocalDate date;
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = DateFormatConstant.DATE_TIME_FORMAT_1)
private LocalDateTime dateTime;
总结:
在项目中可使用上述两种方式配合,使用方式一全局设置,方式二针对特殊请求参数进行处理,来实现对LocalDate、LocalDateTime 、LocalTime类型的转换。
对于需要使用ObjectMapper对某些对象进行json转换时,可以使用IOC对象,此时上述注解依然有效。
@Autowired
private ObjectMapper objectMapper;
或使用如下方式获取ObjectMapper对象:
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer) {
Jackson2ObjectMapperBuilder jsonBuilder = Jackson2ObjectMapperBuilder.json();
jackson2ObjectMapperBuilderCustomizer.customize(jsonBuilder);
return jsonBuilder.build();
}