2022-01-10 ObjectMapper问题:Cannot construct instance of `java.time.LocalDateTime`
ObjectMapper问题:Cannot construct instance of `java.time.LocalDateTime`问题描述解决方法解决步骤问题描述由于想再全局中对 JavaBean 的返回属性进行统一的空值忽略,于是对ObjectMapper 进行setSerializationInclusion(JsonInclude.Include.NON_NULL)@Beanpubl
问题描述
由于想再全局中对 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 转换问题折腾了好久,麻了…
更多推荐
所有评论(0)