在上一篇博客中我们有介绍过 springboot从request parameter中转换Data与Time, 相对于没那么多Controller中的方法需要转换的处理,上述提供的解决方案是比较直接且清晰的。
但是上述博客中提供的解决方案的缺点也比较明显,那就是我们需要对每个使用的方法处都加上@DateTimeFormat并配置相应的iso或者pattern属性值。
那有没有什么方式可以全局的解决这样的问题么,这就引入了这篇文章中我们讨论的spring的type converters。
还是以jdk8中的LocalDate 与 LocalDateTime 类型转换为例进行说明。
创建Type Converters
我们可以新建一个类,实现org.springframework.core.convert.converter.Converter<S, T>接口,其中S表示source源对象类型,T表示target目标对象类型。
String对象转换为LocalDate对象
- 创建LocalDateConverter类
- 实现Converter<S, T>接口,设置源对象类型为String,目标对象类型为LocalDate
- 在LocalDateConverter类中新增一个私有的DateTimeFormatter成员变量
- 新建一个构造器,传入一个dateFormat的格式化字符串,比如dd.MM.yyyy,用于生成DateTimeFormatter对象, 赋值给第三步定义的私有的DateTimeFormatter成员变量
- 复写convert() 方法,具体逻辑如下所示
public final class LocalDateConverter implements Converter<String, LocalDate> {
private final DateTimeFormatter formatter;
public LocalDateConverter(String dateFormat) {
this.formatter = DateTimeFormatter.ofPattern(dateFormat);
}
@Override
public LocalDate convert(String source) {
if (source == null || source.isEmpty()) {
return null;
}
return LocalDate.parse(source, formatter);
}
}
String对象转换为LocalDateTime对象
- 创建LocalDateTimeConverter类
- 实现Converter<S, T>接口,设置源对象类型为String,目标对象类型为LocalDateTime
- 在LocalDateTimeConverter类中新增一个私有的DateTimeFormatter成员变量
- 新建一个构造器,传入一个datetimeFormat的格式化字符串,比如dd.MM.yyyy HH:mm:ss.SSSZ,用于生成DateTimeFormatter对象, 赋值给第三步定义的私有的DateTimeFormatter成员变量
- 复写convert() 方法,具体逻辑如下所示
public final class LocalDateTimeConverter implements Converter<String, LocalDateTime> {
private final DateTimeFormatter formatter;
public LocalDateTimeConverter(String dateFormat) {
this.formatter = DateTimeFormatter.ofPattern(dateFormat);
}
@Override
public LocalDateTime convert(String source) {
if (source == null || source.isEmpty()) {
return null;
}
return LocalDateTime.parse(source, formatter);
}
}
上述Converter如何在springboot应用中生效
上述新增的LocalDateConverter 与LocalDateTimeConverter 需要经历如下几步才能在springboot应用中生效
- 实现WebMvcConfigurer接口
- 复写WebMvcConfigurer接口的addFormatters(FormatterRegistry registry) 方法
- 在上述复写的方法内部逻辑中加入我们新增的LocalDateConverter 与LocalDateTimeConverter
@Configuration
public class WebMvcExtend implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new LocalDateConverter("yyyy-MM-dd"));
registry.addConverter(new LocalDateTimeConverter("yyyy-MM-dd'T'HH:mm:ss.SSS"));
}
}
上述操作全部完成后,启动springboot应用,原先需要@DateTimeFormat注解进行处理才能正确转换的方法,现在可以使用全局的Converter进行处理,程序也能正常运行成功。
网友评论