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:
如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!

posted @ 2018-11-27 18:57  从此寂静无声  阅读(3253)  评论(1编辑  收藏  举报