zoukankan      html  css  js  c++  java
  • Json timestamp转LocalDateTime报错JSON parse error: raw timestamp (1595952000000) not allowed for `java.time.LocalDateTime`: need additional information such as an offset or time-zone (see class Javadocs)

    异常信息

    Error while extracting response for type [class com.xxx.xxx.provider.user.entity.User] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException:
    JSON parse error: raw timestamp (1595952000000) not allowed for `java.time.LocalDateTime`: need additional information such as an offset or time-zone (see class Javadocs);
    nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: raw timestamp (1595952000000) not allowed for `java.time.LocalDateTime`: need additional information such as an offset or time-zone
    (see class Javadocs) at [Source: (PushbackInputStream); line: 1, column: 234] (through reference chain: com.xxx.xxx.provider.user.entity.User["birthday"])

    在数据库查询后,往调用方返回的序列化结果时,做了一层转化,把LocalDataTime转为时间戳,但是在内部feign调用时,接收方需要LocalDataTime,此时就出现这个异常.

    解决办法加一个LocalDataTime序列化的配置类,在接受时再转一次.

    @Configuration
    public class LocalDateTimeSerializerConfig {
    
        @Bean
        public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
            return builder -> {
                builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer());
                builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer());
            };
        }
    
        /**
         * 序列化
         */
        public static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
            @Override
            public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers)
                    throws IOException {
                if (value != null) {
                    long timestamp = value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
                    gen.writeNumber(timestamp);
                }
            }
        }
    
        /**
         * 反序列化
         */
        public static class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
            @Override
            public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext)
                    throws IOException {
                long timestamp = p.getValueAsLong();
                if (timestamp > 0) {
                    return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
                } else {
                    return null;
                }
            }
        }
    }
  • 相关阅读:
    20200807日报
    20200806日报
    《大道至简》读书感悟
    20200805日报
    20200804日报
    20200803日报
    20200802日报
    vue中mounted内如何调完异步方法再渲染
    小程序画布识别iPhone11
    np.meshgrid() 生成网格坐标函数
  • 原文地址:https://www.cnblogs.com/runwithraining/p/13606692.html
Copyright © 2011-2022 走看看