zoukankan      html  css  js  c++  java
  • SpringBoot前后端分离Instant时间戳自定义解析

    在SpringBoot项目中,前后端规定传递时间使用时间戳(精度ms).

    @Data
    public class Incident {
        @ApiModelProperty(value = "故障ID", example = "1")
        private Integer id;
        @ApiModelProperty(value = "故障产生时间", allowEmptyValue = true)
        private Instant createdTime;
        @ApiModelProperty(value = "故障恢复时间", allowEmptyValue = true)
        private Instant recoveryTime;
    }
    

    以上为简略实体类定义.

        @Transactional(rollbackFor = Exception.class)
        @PostMapping(path = "/incident")
        public void AddIncident(@Valid @RequestBody Incident incident) {
    
            incident.setBusinessId(0);
            if (1 != incidentService.addIncident(incident)) {
                throw new Exception("...");
            }
        }
    

    在实际使用过程中,发现Incident中的createdTime以及recoveryTime数值不对.
    排查故障,前端去除时间戳后三位(即ms数),则时间基本吻合.
    因此,可以确定是SpringBoot在转换Instant时使用Second进行转换.

    因此对于Instant类型的转换添加自定义解析(SpringBoot使用com.fasterxml.jackson解析数据).
    注意,.此处需要分别实现序列化(后端返回前端数据)以及反序列化(前端上传数据).

    public class InstantJacksonDeserialize extends JsonDeserializer<Instant> {
        @Override
        public Instant deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            String text = jsonParser.getText();
            Long aLong = Long.valueOf(text);
            Instant res = Instant.ofEpochMilli(aLong);
            return res;
        }
    }
    
    public class InstantJacksonSerializer extends JsonSerializer<Instant> {
        @Override
        public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeNumber(instant.toEpochMilli());
        }
    }
    

    在涉及到Instant的属性上加上相应注解,代码具体如下:

    @Data
    public class Incident {
        @ApiModelProperty(value = "故障ID", example = "1")
        private Integer id;
        @JsonSerialize(using = InstantJacksonSerializer.class)
        @JsonDeserialize(using = InstantJacksonDeserialize.class)
        @ApiModelProperty(value = "故障产生时间", allowEmptyValue = true)
        private Instant createdTime;
        @JsonSerialize(using = InstantJacksonSerializer.class)
        @JsonDeserialize(using = InstantJacksonDeserialize.class)
        @ApiModelProperty(value = "故障恢复时间", allowEmptyValue = true)
        private Instant recoveryTime;
    }
    

    添加注解后,Instant对象能够按照ms精度进行解析.

    PS:
    如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!

  • 相关阅读:
    wordpress通过$wpdb获取一个分类下所有的文章
    WordPress的摘要显示方式
    WordPress简洁的SEO标题、关键词和描述
    WordPress获取特色图像的链接地址
    WordPress的Bootstrap面包屑导航
    destoon 6.0 手机站支持在所有浏览器访问
    dede织梦5.7的安全防护设置
    WordPress主题制作:基础样式文件
    LInux常用到的命令(面试)
    1030 完美数列 (25分) PAT-B
  • 原文地址:https://www.cnblogs.com/jason1990/p/10028262.html
Copyright © 2011-2022 走看看