Spring Boot 在Java11中,结束0从ZonedDateTime对象的毫秒部分被截断

9vw9lbht  于 2023-06-05  发布在  Spring
关注(0)|答案(1)|浏览(223)

我正在将我的Sping Boot 应用程序升级到Spring Boot 2.7.8和Java 11。升级后,我得到了ZonedDateTime对象不同的rest响应。
我的请求包含“2023-06- 23 T18:13:06.630Z[UTC]”,并且我在响应中返回与Map键相同的请求对象。但在响应中,从毫秒部分结束0被修剪“2023-06- 23 T18:13:06.63 Z[UTC]”。

Request:
{
    "dateList": [
       "2023-06-23T18:13:06.630Z[UTC]"
    ]
}

Response:
{
    "dateList": {
        "2023-06-23T18:13:06.63Z[UTC]": "2023-06-23T11:13:06.630-07:00"
    }
}

以前有人遇到过这个问题吗?
这个问题的任何解决方案,因为我使用ZonedDateTime的Map键,我需要保持一致。

roqulrg3

roqulrg31#

这是Jackson的一个已知问题,会影响ZonedDateTime对象的序列化。
这个问题是由于Jackson默认使用Java内置的DateTimeFormatter来序列化和反序列化日期和时间,所以这种格式不会以毫秒为单位保留尾随的零。
要解决此问题,可以将Jackson配置为使用自定义日期/时间格式,该格式以毫秒为单位保留尾随零
我尝试了这个方法,并为Jackson创建了一个custome配置:

@Configuration
public class JacksonConfig {

    @Value("${spring.jackson.date-format}")
    private String dateFormat;

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
        return builder -> {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
            builder.simpleDateFormat(dateFormat).serializers(new ZonedDateTimeSerializer(formatter));
            builder.deserializers(new ZonedDateTimeDeserializer(formatter));
        };
    }

    public static class ZonedDateTimeSerializer extends StdSerializer<ZonedDateTime> {

        private final DateTimeFormatter formatter;

        public ZonedDateTimeSerializer(DateTimeFormatter formatter) {
            super(ZonedDateTime.class);
            this.formatter = formatter;
        }

        @Override
        public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeString(formatter.format(value));
        }
    }

    public static class ZonedDateTimeDeserializer extends StdDeserializer<ZonedDateTime> {

        private final DateTimeFormatter formatter;

        public ZonedDateTimeDeserializer(DateTimeFormatter formatter) {
            super(ZonedDateTime.class);
            this.formatter = formatter;
        }

        @Override
        public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            String value = p.getValueAsString();
            return ZonedDateTime.parse(value, formatter);
        }
    }
}

相关问题