ObjectMapper问题:Cannot construct instance of `java.time.LocalDateTime`

问题描述

由于想再全局中对 JavaBean 的返回属性进行统一的空值忽略,于是对ObjectMapper 进行setSerializationInclusion(JsonInclude.Include.NON_NULL)

	@Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return objectMapper;
    }

然后就出现了,不能构造 LocalDateTime 的问题
在这里插入图片描述

至此大概知道是自己 ObjectMapper 覆盖了 Spring 容器中自带的Object的问题

解决方法

    @Bean
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder mapperBuilder) {
        ObjectMapper objectMapper = new ObjectMapper();
        mapperBuilder.configure(objectMapper);	// 调用一下这个方法就 over 了
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return objectMapper;
    }

解决步骤

  • 这样就解决了不能构造 LocalDateTime 的问题,毕竟 LocalDateTime 没有提供无参构造。

  • 至于为什么发生这个问题,debug 发现是因为 ObjectMapper 是有一步配置的方法调用。

  • 既然我们覆盖了原本 ObjectMapper,那么就先看看框架自己是怎么构造的,这里对 ObjectMapper 所有的构造方法打上了断点,然后去方法栈看看都调用了那些方法。
    在这里插入图片描述

  • 最后发现在 Jackson2ObjectMapperBuilder 中有一个 configer() 的方法调用
    在这里插入图片描述

  • 于是就装模做样的也调用一下,完美解决(暂时解决,至于为什么,你就赶紧看看为啥然后评论告诉我!!!)
    在这里插入图片描述

分割线: ---------------------------------------------------------------------------------------------------------------------------------
原本是想用 converter 接口去重写转换规则,但是 converter 接口好像只对get请求(key:value)有效,还有HttpMessageConverter 好像也可以,但是还要弄 MediaType 比较麻烦,总之为了 LocalDateTime 转换问题折腾了好久,麻了…

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐