Spring Boot忽略ObjectMapper模块

8
在应用程序上下文中,我已经注册了一个ObjectMapper模块:
@Bean
public SimpleModule jsr310Module() {
    final SimpleModule module = new SimpleModule();
    module.addSerializer(new LocalDateSerializer());
    module.addDeserializer(LocalDate.class, new LocalDateDeserializer());
    return module;
}

我尝试进行调试,程序已加载(或至少在启动时执行了方法public void setupModule(SetupContext context)), 但是当我调用一个返回包含LocalDate对象的rest API时,我的反序列化程序被忽略。

有什么提示可以解决这个问题吗?


你如何注册 ObjectMapper?因为 SimpleModule 需要被注入到 ObjectMapper 中。 - Augusto
我没有配置它,这个模块应该默认配置好了,而且它确实是这样做的...我也可以使用另一种方式,你有什么建议吗? - rascio
你可以查看Spring Boot中的JacksonAutoConfiguration类并尝试进行调试。我正在阅读它并试图弄清楚它是如何配置ObjectMapper的。看起来,如果在类路径中有LocalDateDeserializer类(从版本1.2.2开始),它应该自动加载为JodaDateTimeJacksonConfiguration的一部分。(我仍然很难理解这种类型的配置:S) - Augusto
@rascio “当我调用返回带有LocalDate对象的rest API时,我的反序列化程序被忽略了。” 你是指被忽略的是 _serializer_,对吗? - ci_
是的,抱歉...最终我解决了,原来是我忘记扩展 WebMvcAutoConfiguration 类了... - rascio
2个回答

2
为了使其起作用,@Configuration类应该继承 WebMvcAutoConfiguration 类。

这个怎么知道呢?文档中没有提到,只有 com.fasterxml.jackson.databind.Module 类型的任何bean会自动注册到自配置的 Jackson2ObjectMapperBuilder 中,并应用于它创建的任何 ObjectMapper 实例。这为在向应用程序添加新功能时贡献自定义模块提供了全局机制。 - kqr

1
根据Spring Boot文档,要配置ObjectMapper,您可以自己定义bean并使用@Bean@Primary进行注释。在那里,您可以注册该模块。或者,您可以添加一个类型为Jackson2ObjectMapperBuilder的bean,您可以在其中自定义ObjectMapper。

5
你提供的文档也指出:“另一种自定义Jackson的方式是向上下文添加类型为com.fasterxml.jackson.databind.Module的bean。它们将与每个ObjectMapper类型的bean一起注册,在您向应用程序添加新功能时提供了一种全局机制来贡献自定义模块。” 看起来这正是原帖作者想要做的。 - ci_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接