Spring 和 MappingJackson2HttpMessageConverter 和 registerModule

tjh*_*s66 3 java spring json spring-mvc jackson-modules

我们正在使用最新的 Spring 4.2.x,最近从 Jackson Mapper 2.6.3 升级到 2.8.8,现在我们正在注册模块。

\n\n

这是 spring-servlet.xml 的一部分:

\n\n
<mvc:annotation-driven>\n    <mvc:message-converters register-defaults="true">\n        <bean\n            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">\n            <property name="objectMapper">\n                <bean class="com.fasterxml.jackson.databind.ObjectMapper">\n                    <property name="dateFormat">\n                        <bean class="java.text.SimpleDateFormat">\n                            <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>\n                        </bean>\n                    </property>\n                </bean>\n            </property>\n        </bean>\n    </mvc:message-converters>\n</mvc:annotation-driven>\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我们在代码中映射 json 文件的内容:

\n\n
\xe2\x80\x82   ObjectMapper mapper = new ObjectMapper();\n    mapper.registerModule(new ParameterNamesModule());\n    mapper.registerModule(new Jdk8Module());\n    mapper.registerModule(new JavaTimeModule());\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,我想做的是配置“spring-servlet”和“MappingJackson2HttpMessageConverter”,以便我可以添加要注册的模块。

\n\n

是的,我们还没有开始使用@Configuration,我们仍在使用XML,我根本不介意。

\n\n

谢谢你的帮助!

\n

tjh*_*s66 5

因此,经过一些测试和反复试验,我们想出了一个 springmvc-servlet.xml,如下所示:

<context:annotation-config />
<context:component-scan base-package="com.tomholmes.mycode.core.server.controller" />

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<bean id="objectMapper"
    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">

    <property name="featuresToDisable">
        <array>
            <util:constant
                static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS" />
        </array>
    </property>

    <property name="dateFormat">
        <bean class="java.text.SimpleDateFormat">
            <constructor-arg type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
        </bean>
    </property>

    <property name="modulesToInstall"
        value="
        com.fasterxml.jackson.datatype.jdk8.Jdk8Module,
    com.fasterxml.jackson.datatype.jsr310.JavaTimeModule,
    com.fasterxml.jackson.module.paramnames.ParameterNamesModule" />
</bean>

<bean id="jsonHttpMessageConverter"
    class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper" ref="objectMapper" />
</bean>

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonHttpMessageConverter" />
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

这个设置似乎起到了作用。