在SpringBoot项目中,前后端规定传递时间使用时间戳(精度ms).
@Datapublic 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
数值不对.
SpringBoot
在转换Instant
时使用Second
进行转换. 因此对于Instant
类型的转换添加自定义解析(SpringBoot
使用com.fasterxml.jackson
解析数据).
public class InstantJacksonDeserialize extends JsonDeserializer{ @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{ @Override public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeNumber(instant.toEpochMilli()); } }
在涉及到Instant
的属性上加上相应注解,代码具体如下:
@Datapublic 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
精度进行解析.
https://www.cnblogs.com/jason1990/p/10028262.html