Spring中自定义类型转换器实现-基于JavaConfig配置

最近需要实现一个需求,把前端传给后台的字符串时间戳参数使用LocalDateTime接收。这里分为两种情况:

  1. Body中的参数
  2. url参数

第一种情况需要使用HttpMessageConverter接口,这里不做说明,有需要的可以回复我。今天主要讲第二种情况,其实也很简单,添加自定义转换器就可以,Spring中想要实现自定义转换器只要实现Converter接口的可以了,接下来我们就看下如何实现,一共需要两步,上代码。

1. 自定义接口

这里我想要实现把字符串格式的时间戳(毫秒)转换为java.time.LocalDateTime,代码如下:

import org.springframework.core.convert.converter.Converter;
import org.springframework.lang.NonNull;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;

public class StringTimeStampToLocalDateTimeConverter implements Converter<String, LocalDateTime> {

    @Override
    public LocalDateTime convert(@NonNull String source) {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.systemDefault());
    }
}
2. 注册自定义转换器

这里我们通过Spring提供的WebMvcConfigurer来实现注册转换器,代码如下:

import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @author AlanSun
 * @date 2019/6/19 15:53
 **/
@Component
public class MyMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringTimeStampToLocalDateTimeConverter());
    }
}

Spring允许一个类型对(在本例中是String -- LocalDateTime)有多个转换器。
所以这里当执行FormatterRegistry.addConverter()时会把新加入的转换器添加到第一个(通过LinkedList.addFirst()方法)。

这样就大功告成了!!!希望对大家有帮助。


看的脑子好大,给个赞把!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容