首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为java.time.LocalDateTime自定义全局杰克逊反序列化器

如何为java.time.LocalDateTime自定义全局杰克逊反序列化器
EN

Stack Overflow用户
提问于 2018-08-24 01:54:03
回答 3查看 7K关注 0票数 4

杰克逊的serialize/deserializejava.time在全球范围内都很好,但它的默认日期时间格式是ISO标准,比如2018-01-10T10:20:30 for LocalDateTime和2018-01-10T10:20:30+08:00 for OffsetDateTime。但是我需要为LocalDateTime和OffsetDateTime设置一个全局本地格式,比如LocalDateTime和OffsetDateTime,而不需要T和OffsetTime (使用本地默认OffsetTime)。我该怎么做?

注:我知道@JsonFormat@JsonSerialize@JsonDeserialize。这不是全球性的环境。

EN

回答 3

Stack Overflow用户

发布于 2019-01-10 11:13:13

弹簧靴

代码语言:javascript
复制
    @SpringBootApplication
    public class Application implements Jackson2ObjectMapperBuilderCustomizer {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }

        @Override
        public void customize(Jackson2ObjectMapperBuilder builder) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(formatter);

            builder.failOnEmptyBeans(false) // prevent InvalidDefinitionException Error
                    .serializerByType(LocalDateTime.class, localDateTimeSerializer);
        }
    }

Springboot & Spring框架

代码语言:javascript
复制
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(formatter);
            LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(formatter);

            JavaTimeModule module = new JavaTimeModule();
            module.addSerializer(LocalDateTime.class, localDateTimeSerializer);
            module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);

            ObjectMapper mapper = new ObjectMapper();
            mapper.registerModule(module);
            // add converter at the very front
            // if there are same type mappers in converters, setting in first mapper is used.
            converters.add(0, new MappingJackson2HttpMessageConverter(mapper));
        }
    }

希望这能帮到你。

票数 6
EN

Stack Overflow用户

发布于 2018-08-24 02:32:39

您可以配置一个ObjectMapper。本页解释了https://www.baeldung.com/jackson-serialize-dates是如何实现的。我想你想要接近那一页的例子4的东西。

然后,您需要使之成为全局ObjectMapper。不同的框架使用不同的方法。本页解释了如何在Spring和Spring Configuring ObjectMapper in Spring中这样做。对于其他人,只要谷歌就可以了。

票数 0
EN

Stack Overflow用户

发布于 2021-06-07 10:22:19

如果您正在全局地使用ObjectMapper的单个实例(并且想要一个独立于Spring/Java8Jackson模块的解决方案),您可以这样做:

代码语言:javascript
复制
public ObjectMapper getCustomConfigMapper() {
    final ObjectMapper mapper = new ObjectMapper();
    final SimpleModule module = new SimpleModule();
    module.addDeserializer(LocalDateTime.class, new CustomLocaDateTimeDeserializer());
    mapper.registerModule(module);
    return mapper;
}

public static class CustomLocaDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    public static final DateTimeFormatter CUSTOM_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext __) throws IOException {
        final String value = jsonParser.getText().strip();
        return LocalDateTime.parse(value, CUSTOM_FORMATTER);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51996459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档