如何在Spring MVC非Spring Boot应用程序中自定义Jackson

问题描述

Spring MVC 4.3.29和Java 8(当前平台约束),以及大多数XML配置,除了一些注释注释的Controller类。

简而言之,我想让ObjectMapper实例由Spring JSON反序列化自动使用,我想将其FAIL_ON_UNKNowN_PROPERTIES设置回true

我看到了several related questions,但是所有示例似乎都是Spring Boot和/或Java配置。在我的WebSphere环境中,所有建议的@Autowired bean(映射器,Builder等)都没有任何值。

希望我只是在某个地方缺少一些简单的胶水。

编辑:B,我以为我已经拥有了它:

@Configuration
public class CustomWebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                ((MappingJackson2HttpMessageConverter) converter).getobjectMapper().
                    enable(DeserializationFeature.FAIL_ON_UNKNowN_PROPERTIES);
                break;
            }
        }
    }
}

通过调试器,我可以看到它被命中并更改了预期的标志。但是,当使用时,该行为无效。我不再有任何XML覆盖,但是我仍然有“ master” <mvc:annotation-driven/>。我想知道它们是否使彼此混淆...

解决方法

这种“有效”的方法,但是通过完全替换Spring的ObjectMapper,然后它失去了它具有的其他自定义功能,而我真的不想这样做。

来自this answer

<bean id="myObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>

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

然后我可以 @Autowired注入那些对象并将其弄乱,但是在这种情况下,我不需要这样做,因为只有一个新的默认杰克逊ObjectMapper实际上已还原我想要的行为。

,

好,是的,只要与@EnableWebMvc而不是<mvc:annotation-driven/>结合使用,就可以工作:

@EnableWebMvc
@Configuration
public class CustomWebConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                ((MappingJackson2HttpMessageConverter) converter).getObjectMapper().
                    enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
                break;
            }
        }
    }
}