Spring Boot中OffsetDateTime的Jackson日期格式

Dav*_*ave 12 java spring jackson spring-boot

我正在尝试从Spring应用程序输出OffsetDateTime,并在我的application.properties中有这些属性:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm
Run Code Online (Sandbox Code Playgroud)

但是,当返回日期时,它的格式为

"2017-01-30T16:55:00Z"
Run Code Online (Sandbox Code Playgroud)

我应该如何在Spring应用程序中正确配置日期格式?

Utk*_* A. 12

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Run Code Online (Sandbox Code Playgroud)

通过这样做,您可以获得 ISO 8601 的 OffsetDateTime 属性,包括目标中的偏移量。


Dav*_*ave 11

所以我设法找到了解决方案,但如果您有其他选择请发布.

我最终创建了一个新的主ObjectMapperbean,并注册了一个带有自定义序列化程序的新模块OffsetDateTime.我可以在这里设置我自己的日期格式,使用java.time.format.DateTimeFormatter.我还必须在JavaTimeModule我的映射器中注册.

@Configuration
public class JacksonOffsetDateTimeMapper{

    @Primary
    @Bean
    public ObjectMapper objectMapper() {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
            @Override
            public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
                jsonGenerator.writeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(offsetDateTime));
            }
        });
        objectMapper.registerModule(simpleModule);

        return objectMapper;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 对于我的情况,我需要的只是 ObjectMapper 上的 `.registerModule(new JavaTimeModule())` (2认同)

Les*_*ieM 7

添加对 jackson-modules-java8 的依赖对我有用(jackson-datatype-jsr310 已弃用)

<!-- deserialize Java 8 date time types e.g OffsetDateTime --> 
<dependency> 
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-modules-java8</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

我还需要添加它才能工作:

 om.registerModule(new JavaTimeModule());
Run Code Online (Sandbox Code Playgroud)

不需要 write-dates-as-timestamps=false 或 om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - 适用于 Java“日期”对象。

我使用了这个注释:

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")  
Run Code Online (Sandbox Code Playgroud)

并得到如下输出:

“时间戳”:“2020-04-23T08:00:00.000-06:00”

  • 您实际上并不需要像这样手动注册模块;您只需将 JavaTimeModule bean 添加到您的应用程序上下文中,boot 就会为您完成此操作:`com.fasterxml.jackson.databind.Module 类型的任何 bean 都会自动注册到自动配置的 Jackson2ObjectMapperBuilder 并应用于任何 ObjectMapper它创建的实例。当您向应用程序添加新功能时,这提供了一种贡献自定义模块的全局机制。 (2认同)
  • `请注意,从 2.6 开始,该模块不支持自动注册,因为存在旧版本 JSR310Module。旧版具有相同的功能,但默认配置略有不同:有关详细信息,请参阅 JSR310Module。 (2认同)