最近需要实现一个需求,把前端传给后台的字符串时间戳参数使用LocalDateTime
接收。这里分为两种情况:
- Body中的参数
- 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()
方法)。
网友评论