不废话,直接上代码
包含了对 LocalDate/LocalDateTime/Date 的解析与格式化
@Configuration
public class DateFormatConfig {
@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
private String pattern;
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)))
.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}
@Bean
public Formatter<LocalDate> localDateFormatter() {
return new Formatter<LocalDate>() {
@Override
public LocalDate parse(String text, Locale locale) throws ParseException {
return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
@Override
public String print(LocalDate object, Locale locale) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd").format(object);
}
};
}
@Bean
public Formatter<LocalDateTime> localDateTimeFormatter() {
return new Formatter<LocalDateTime>() {
@Override
public LocalDateTime parse(String text, Locale locale) throws ParseException {
return LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Override
public String print(LocalDateTime object, Locale locale) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(object);
}
};
}
/**
* 前端date-time解析为Date
* Date返回前端格式由 spring.jackson.date-format 指定
*/
@Bean
public DateFormatter dateFormatter() {
return new DateFormatter(pattern);
}
}
然而实际使用中,会发现使用@RequestBody接收的参数,以这种方式处理并不会生效,原因在于,Spring在处理@RequestParam和表单参数的方式和@RequestBody参数的方式不一致,那上面的配置自然就对@RequestBody接收的参数无效了;SpringMVC默认使用的是jackson来解析json参数以及返回json数据;所以我们需要自定义jackson行为,自定义 ObjectMapper Bean即可,由于ObjectMapper配置项较多,以下只配置本文相关内容,
@Bean
public ObjectMapper ObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
// 序列化
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HHmm:ss")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyyMMdd")));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addSerializer(Date.class, new DateSerializer(false, new SimpleDateFormat("yyyy-MM-dd HHmm:ss")));
// 反序列化
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyyMM-dd")));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer(){
@SneakyThrows
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext dc){
String text = jsonParser.getText().trim();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(text);
}
});
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
写在最后,当我们自定义jackson行为后需要注意以下几点
1.关于@DateTimeFormat: 不生效(优先级低于全局配置)(用于定义@RequestParam和表单参数格式)
@JsonFormat生效(优先级高于全局配置)(用于解析@RequestBody和响应数据)
2.之前的Date类型返回由yaml date-format: yyyy-MM-dd HH:mm:ss指定,现也不再生效
1034

被折叠的 条评论
为什么被折叠?



