我有这样的课:
public class MyLocalApplicationClass {
private String name
private LocalDateTime creationDate;
private String createdBy;
}
在我从一个rest服务收到的响应中,我得到了这个对象(作为一个json):
public class MyRemoteApplicationClass {
private String name
private Date creationDate;
private String createdBy;
}
因此,当我发送请求时,我会从MyRemoteApplicationClass中获取creationDate的值(json),如下所示:
{
“name”:”anything”,
"creation_date": 1666190973000,
"created_by": “anyone”
}
因此,我想知道是否可以将其作为LocalDateTime接收,或者我应该将其作为Date接收,然后将其转换为LocalDateTime(我认为这是最好的选择)?
因为我尝试以LocalDateTime的形式接收它,但它抛出以下错误:
raw timestamp (1656015404000) not allowed for
java.time.LocalDateTime: need additional information such as an
offset or time-zone (see class Javadocs)
此外,我尝试仅以LocalDate
的形式接收它,但它抛出了以下错误(我已经添加了jsr310的依赖项,还添加了带有此注解@JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class)
的序列化器和反序列化器,因此我认为真实的的问题是警告)和警告:
Java 8 date/time type `java.time.DateTimeException` not supported
by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
to enable handling (through reference chain:
com.fasterxml.jackson.databind.JsonMappingException["cause"])
WARN -- com.fasterxml.jackson.databind.JsonMappingException:
Invalid value for EpochDay (valid values -365243219162 - 365241780471): 1656015404000
1条答案
按热度按时间qpgpyjmq1#
TL;DR
有几种可能的解决方案:
JavaTimeModule
并应用所需的时间戳精度来应用全局配置。让我们来了解一下这些选项。
剖析建构函式内的时间戳记
我们可以在
MyLocalApplicationClass
内声明 *all-args构造函数 *,并使用@JsonProperty
注解每个参数。*contranctior参数 *creationDate
应作为long
接收,因为它将被手动从epoch毫秒解析为LocalDateTime
。它可能看起来像这样:
应用全局配置
另一个选项是应用全局反序列化配置。
但这需要将
creationDate
属性的类型更改为Instant
。要正确配置
ObjectMapper
,我们需要采取两个步骤:JavaTimeModule
模块;DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS
设置为false
来向ObjectMapper
指示时间戳的精度。为此,我们可以将
Jackson2ObjectMapperBuilder
和ObjectMapper
作为Bean放入Spring的上下文中。请注意
creationDate
的类型应为Instant
,在这种情况下,仅因为属性和字段名称不匹配(* 它们与转换无关 *),才需要数据绑定注解简化的全局配置
正如@M. Deinum在注解中所指出的,所需的精度可以通过
application.properties
进行配置:我们可以删除在上面示例的配置类中声明的两个Bean(* Map器和Map器构建器 *),因为
JacksonAutoConfiguration
会在应用程序启动时获取并注册所有已知模块。MyLocalApplicationClass
的声明与上面显示的声明相同(creationDate
的类型为java.time.Instant
)。创建自定义反序列化程序
最后,我们可以通过扩展
StdDeserializer
并重写其abstract
方法deserialize()
来实现自定义的反序列化器。要指示Jackson应用此反序列化程序,可以通过
@JsonDeserialize
注解的using
属性来指定,该注解应放置在creationDate
字段的顶部。