SpringBoot 自定义JsonSerializer使用HttpServletRequest
需求:时间格式转换,将 LocalDateTime 转换成 时间戳 格式,但是需要兼容老版本WEB/APP,需要使用 Header 中的 Api-Version 字段,进行版本判断。
1.先看一下错误代码(此时,request=null)
@Component
public class LocalDateTime2TimestampSerializer extends JsonSerializer<LocalDateTime> {
@Resource
private HttpServletRequest request;
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String apiVersion = request.getHeader("Api-Version");
if (StringUtils.isBlank(apiVersion) || VersionUtils.afterVersion(apiVersion, "v1.2.23")) {
//将LocalDateTime格式转成时间戳返回前端
if (localDateTime != null) {
jsonGenerator.writeNumber(DateUtils.LocalDateTime2timestamp(localDateTime));
return;
}
}
if (localDateTime != null) {
jsonGenerator.writeString(localDateTime.format(DateUtils.yyyyMMddHHmmss_LocalDate));
}
}
}
2.将代码进行一下修改(换了另一种注入方式)
@Component
@NoArgsConstructor
public class LocalDateTime2TimestampSerializer extends JsonSerializer<LocalDateTime> {
private static HttpServletRequest request;
@Autowired//需要使用构造器注入,直接 属性注入,request=null
public LocalDateTime2TimestampSerializer(HttpServletRequest request) {
LocalDateTime2TimestampSerializer.request = request;
}
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
String apiVersion = request.getHeader("Api-Version");
if (StringUtils.isBlank(apiVersion) || VersionUtils.afterVersion(apiVersion, "v1.2.23")) {
//将LocalDateTime格式转成时间戳返回前端
if (localDateTime != null) {
jsonGenerator.writeNumber(DateUtils.LocalDateTime2timestamp(localDateTime));
return;
}
}
if (localDateTime != null) {
jsonGenerator.writeString(localDateTime.format(DateUtils.yyyyMMddHHmmss_LocalDate));
}
}
}
最后,原因未知。找时间看下底层源码,先记录一下。如果有大神路过,希望可以指点一下我。万分感谢。
作者:cchilei
-------------------------------------------
个性签名:竹杖芒鞋轻胜马 一蓑烟雨任平生
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!