json - Spring Boot,为 Json 和 java.time.* 全局定义时区

标签 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,并且我更喜欢有一个全局配置。 根据this enhancemente request ,我用这个配置解决了 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

最佳答案

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

参见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));
            }
        };
    }
}

关于json - Spring Boot,为 Json 和 java.time.* 全局定义时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44879426/

相关文章:

javascript - json_encode 不保留顺序

java - 通过 Hibernate(不是 JDBC)从 blob 中检索图像

java - 除了log4j xml、属性文件和源代码(主要是java)之外,还有其他方式配置日志吗?

java - 使用列表删除数组

java - 基于命令行参数的多个 Spring boot CommandLineRunner

json - 如何使用 ConvertTo-Json 将 powershell 数组转换为 json?

javascript - 如何使用所有对象的通用 JavaScript 函数将 JSON 对象显示为 HTML 中下拉列表的选项

spring-mvc - SpringBoot WebFlux - 发出并行 WebClient 请求

java - 休息模板 - 没有可用的缓冲区空间(已达到最大连接数?)

php - 重命名获取的 mysql 然后编码为 JSON