Spring Boot,为Json和java.time定义时区。* global

时间:2017-07-03 06:53:46

标签: json spring spring-boot jackson

我使用Spring Boot 1.5.3,Spring Data REST,HATEOAS来创建REST服务。 我在我的应用程序中使用java.time.*日期/时间,并且我将其以UTC格式存储在数据库中。 我想遵循最佳实践并在REST端点中返回UTC日期。

使用@JsonFormat我能够完成:

@JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
@LastModifiedDate
private LocalDateTime lastModifiedDate;

我想避免使用它来注释我的所有bean,我宁愿进行全局配置。 根据{{​​3}},我能够通过此配置解决50%的问题:

@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
    return new Jackson2ObjectMapperBuilderCustomizer() {

        @Override
        public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
            jacksonObjectMapperBuilder.serializers(
                    new LocalDateTimeSerializer(new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss").toFormatter()));
            jacksonObjectMapperBuilder.serializers(new ZonedDateTimeSerializer(
                    new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").toFormatter()));
        }

    };
}

这解决了模式问题,但没有解决时区问题。我的时区继续保持当地时区。 有没有一种优雅的方法可以将JSON序列化程序的时区设置为UTC,就像属性spring.jackson.time-zone=UTC一样,不幸的是只适用于java.util.time

1 个答案:

答案 0 :(得分:2)

我认为您需要设置格式化程序的时区。

请参阅https://github.com/jhipster/generator-jhipster/blob/09f0957b3ac9711fb9dd86f77ad69c549401074f/generators/server/templates/src/main/java/package/config/_JacksonConfiguration.java

@Configuration
public class JacksonConfiguration {

    public static final DateTimeFormatter ISO_FIXED_FORMAT =
        DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZone(ZoneId.of("Z"));

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
        return new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder) {
                jackson2ObjectMapperBuilder.serializers(new ZonedDateTimeSerializer(ISO_FIXED_FORMAT));
            }
        };
    }
}