【问题标题】:How to add Jdk8Module on ObjectMapper for Jackson如何在 ObjectMapper 上为 Jackson 添加 Jdk8Module
【发布时间】:2020-02-08 11:16:01
【问题描述】:

我正在使用杰克逊 2.9.6。我有一个控制器,我试图在其中发送一个 Optional 作为我的字段之一。当我收到来自控制器的响应时,我总是以{"field":{"present":true}} 的格式得到它(如question 所示)。

基本上我有一个这样配置的 RestTemplate bean:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </list>
    </property>
</bean>

我想将 Jdk8Module 添加为序列化过程的一部分。我注意到有一个 MappingJackson2HttpMessageConverter(ObjectMapper mapper) 构造函数接受一个 ObjectMapper,我正在考虑创建一个 ObjectMapper bean,它将 Jdk8Module 注册到它(使用在 ObjectMapper 类中找到的一个名为 registerModule(Module module) 的公共方法)所以我可以像这样传递该模块:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <constructor-arg name="objectMapper" ref="ObjectMapperWithJDK8Bean"></constructor-arg>
            </bean>
        </list>
    </property>
</bean>

<bean id="ObjectMapperWithJDK8Bean" class="com.fasterxml.jackson.databind.ObjectMapper">
* Pass in com.fasterxml.jackson.datatype.jdk8.Jdk8Module here via the method *
</bean>

但我目前面临的问题是在创建 bean 时如何从 xml 文件中调用 registModule 方法?我正在使用 Spring 4.1。我是 Spring 新手,所以这非常具有挑战性!

【问题讨论】:

  • 根据this,jdk8模块在类路径中找到时应该自动注册。
  • 但它说这是从 4.​​2 开始添加的...我目前正在使用 4.1:/ 我现在无法真正升级到 4.2
  • 对不起,没看到你的代码这么古老;(
  • 这是您维护的旧版应用程序吗?
  • @chrylis 很不幸

标签: java json spring jackson


【解决方案1】:

您可以使用 java config 而不是 xml 创建一个 bean,例如:

@Configuration
public class GeneralConfiguration { 
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper()
           .registerModule(new ParameterNamesModule())
           .registerModule(new Jdk8Module())
           .registerModule(new JavaTimeModule());
        return mapper;
    }
}

我相信 @Configuration 和 @Bean 注释自 spring 3.0 以来都可用,因此您可以毫无问题地使用它们。 如果您仍希望继续使用基于 xml 的配置,那么:

<bean id="objectMapper"
    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
    <property name="modulesToInstall"
        value="
        com.fasterxml.jackson.datatype.jdk8.Jdk8Module,
        com.fasterxml.jackson.datatype.jsr310.JavaTimeModule,
        com.fasterxml.jackson.module.paramnames.ParameterNamesModule" />
</bean>

阅读doc

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 2012-08-03
    • 2016-06-10
    • 2016-01-28
    • 2012-10-17
    • 2014-05-06
    • 2016-11-03
    • 2013-05-21
    • 2019-03-10
    相关资源
    最近更新 更多