美文网首页文章集墨海
SpringBoot:使用TypeConvert实现类型Stri

SpringBoot:使用TypeConvert实现类型Stri

作者: 花花大脸猫 | 来源:发表于2022-02-05 22:30 被阅读0次

在上一篇博客中我们有介绍过 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进行处理,程序也能正常运行成功。

引用地址:https://www.petrikainulainen.net/programming/spring-framework/spring-from-the-trenches-using-type-converters-with-spring-mvc/

相关文章

网友评论

    本文标题:SpringBoot:使用TypeConvert实现类型Stri

    本文链接:https://www.haomeiwen.com/subject/mntqaltx.html