使用 Jackson JSR310 模块反序列化 LocalDateTime
Deserializing LocalDateTime with Jackson JSR310 module
我正在使用 the Jackson Datatype JSR310 page 中描述的库,但我仍然无法使用它。
我已经配置了以下 bean:
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
return mapper;
}
当我调用 REST API 时,日期格式输出为 yyyy-MM-dd'T'HH:ss.SSSSSS
,例如2015-04-11T00:10:38.905847
。这由我的 AngularJS 代码处理得很好。
当我想向 REST API 提交内容时,日期显示为 yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
,例如2015-04-09T08:30:00.000Z
Jackson 一直在抱怨最后的 'Z'。如果我查看文档中的 LocalDateTimeDeserializer
,它使用的是 DateTimeFormatter.ISO_LOCAL_DATE_TIME
,它归结为 ISO_LOCAL_DATE'T'ISO_LOCAL_TIME
,并且提到它没有覆盖区域。
所以我想我应该在我正在创建的 ObjectMapper
上设置 DateFormat
:
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
return mapper;
}
但这没有任何作用。我将其更改为 yyyy-MM-dd
之类的简单内容,但序列化日期仍保持以前的格式,反序列化也不受影响。
我在这里做错了什么才能让它工作?据我所知,我的 JavaScript 代码中的日期格式是 ISO 8601 格式...
目前 LocalDateTimeDeserializer
似乎不遵守为对象映射器设置的日期格式。
要使其正常工作,您可以覆盖 LocalDateTimeDeserializer
或切换为使用 ZoneDateTime
,它在末尾处理 'Z' 字符。
这是一个例子:
public class Java8DateFormat {
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
// mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
final String date = mapper.writeValueAsString(new Date());
System.out.println(date);
System.out.println(mapper.readValue(date, ZonedDateTime.class));
}
}
输出:
"2015-04-11T18:24:47.815Z"
2015-04-11T18:24:47.815Z[GMT]
没有必要编写自己的序列化程序。使用默认的就足够了,但是用另一种格式(time_zone
格式)创建一个实例,这样超出的部分就被剪掉了:
new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME)
在我的例子中,我有一个像这样的 contextResolver
可以在配置级别实现:
@Service
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
JavaTimeModule javaTimeModule=new JavaTimeModule();
// Hack time module to allow 'Z' at the end of string (i.e. javascript json's)
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
mapper.registerModule(javaTimeModule);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
Hibernate 4,Spring4 - REST WS,客户端 - Spring Boot 1.5.2。在我的例子中,我在 Entity ZonedDateTime class 中使用了数据库中的映射 Timestamp 。 Hibernate 以及 Spring Boot REST 工作正常。我只能将库添加到 pom 文件中:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
所以我想,转换器是在 Spring 内部实现的 LocalDateTime as well.The jackson.version 是最新的。
我正在使用 the Jackson Datatype JSR310 page 中描述的库,但我仍然无法使用它。
我已经配置了以下 bean:
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
return mapper;
}
当我调用 REST API 时,日期格式输出为 yyyy-MM-dd'T'HH:ss.SSSSSS
,例如2015-04-11T00:10:38.905847
。这由我的 AngularJS 代码处理得很好。
当我想向 REST API 提交内容时,日期显示为 yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
,例如2015-04-09T08:30:00.000Z
Jackson 一直在抱怨最后的 'Z'。如果我查看文档中的 LocalDateTimeDeserializer
,它使用的是 DateTimeFormatter.ISO_LOCAL_DATE_TIME
,它归结为 ISO_LOCAL_DATE'T'ISO_LOCAL_TIME
,并且提到它没有覆盖区域。
所以我想我应该在我正在创建的 ObjectMapper
上设置 DateFormat
:
@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
return mapper;
}
但这没有任何作用。我将其更改为 yyyy-MM-dd
之类的简单内容,但序列化日期仍保持以前的格式,反序列化也不受影响。
我在这里做错了什么才能让它工作?据我所知,我的 JavaScript 代码中的日期格式是 ISO 8601 格式...
目前 LocalDateTimeDeserializer
似乎不遵守为对象映射器设置的日期格式。
要使其正常工作,您可以覆盖 LocalDateTimeDeserializer
或切换为使用 ZoneDateTime
,它在末尾处理 'Z' 字符。
这是一个例子:
public class Java8DateFormat {
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JSR310Module());
// mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
final String date = mapper.writeValueAsString(new Date());
System.out.println(date);
System.out.println(mapper.readValue(date, ZonedDateTime.class));
}
}
输出:
"2015-04-11T18:24:47.815Z"
2015-04-11T18:24:47.815Z[GMT]
没有必要编写自己的序列化程序。使用默认的就足够了,但是用另一种格式(time_zone
格式)创建一个实例,这样超出的部分就被剪掉了:
new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME)
在我的例子中,我有一个像这样的 contextResolver
可以在配置级别实现:
@Service
@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
JavaTimeModule javaTimeModule=new JavaTimeModule();
// Hack time module to allow 'Z' at the end of string (i.e. javascript json's)
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));
mapper.registerModule(javaTimeModule);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}
Hibernate 4,Spring4 - REST WS,客户端 - Spring Boot 1.5.2。在我的例子中,我在 Entity ZonedDateTime class 中使用了数据库中的映射 Timestamp 。 Hibernate 以及 Spring Boot REST 工作正常。我只能将库添加到 pom 文件中:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
所以我想,转换器是在 Spring 内部实现的 LocalDateTime as well.The jackson.version 是最新的。