作者:微信小助手
发布时间:2022-06-02T09:10:33
来源:juejin.im/post/5e62817fe51d4526d05962a2 项目中使用LocalDateTime系列作为DTO中时间的数据类型,但是SpringMVC收到参数后总报错,为了配置全局时间类型转换,尝试了如下处理方式。 注:本文基于Springboot2.x测试,如果无法生效可能是spring版本较低导致的。Spring Boot 基础就不介绍了,推荐下这个实战教程:https://github.com/javastacks/spring-boot-best-practice PS:如果你的Controller中的LocalDate类型的参数啥注解(RequestParam、PathVariable等)都没加,也是会出错的,因为默认情况下,解析这种参数是使用 这种情况要和时间作为Json字符串时区别对待,因为前端json转后端pojo底层使用的是Json序列化Jackson工具( 实现 org.springframework.core.convert.converter.Converter,自定义参数转换器,如下: 点评:以上两个bean会注入到spring mvc的参数解析器(好像叫做 注意: 当我再次启动项目时却出现了异常:
ModelAttributeMethodProcessor
进行处理,而这个处理器要通过反射实例化一个对象出来,然后再对对象中的各个参数进行convert,但是LocalDate类没有构造函数,无法反射实例化因此会报错!!!完成目标
LocalTime
、
localDate
和
LocalDateTime
GET请求及POST表单日期时间字符串格式转换
HttpMessgeConverter
);而时间字符串作为普通请求参数传入时,转换用的是Converter
,两者在处理方式上是有区别。使用自定义参数转换器(Converter)
@Configuration
public class DateConverterConfig {
@Bean
public Converter<String, LocalDate> localDateConverter() {
return new Converter<String, LocalDate>() {
@Override
public LocalDate convert(String source) {
return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
};
}
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(String source) {
return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
};
}
}ParameterConversionService
),当传入的字符串要转为LocalDateTime类时,spring会调用该Converter对这个入参进行转换。关于自定义的参数转换器 Converter,这里我遇到了一个坑,我再这里详细记录下
,本来我的想法是为了代码精简,将上面匿名内部类的写法精简成lambda表达式的方式: @Bean
@ConditionalOnBean(name = "requestMappingHandlerAdapter")
public Converter<String, LocalDate> localDateConverter() {
return source -> LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
}Caused by: java.lang.IllegalArgumentException: Unable to determine source