首页 > 解决方案 > 如何在 Spring MVC(不是 Spring Boot)应用程序中自定义 Jackson

问题描述

Spring MVC 4.3.29 和 Java 8(当前平台约束),主要是 XML 配置,除了一些经过注释扫描的 Controller 类。

简而言之,我想让ObjectMapperSpring JSON 反序列化自动使用的实例,我想将其设置FAIL_ON_UNKNOWN_PROPERTIEStrue.

我看到了几个 相关的 问题,但所有示例似乎都是Spring Boot和/或 Java 配置。在我的 WebSphere 环境中,所有建议的@Autowiredbean(Mapper、Builder 等)都没有任何值。

希望我只是在某处遗漏了一些简单的胶水。

编辑:呸,我以为我有这个:

@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 覆盖,但我仍然有“主人” <mvc:annotation-driven/>。我想知道这些是否相互混淆......

标签: springspring-mvcjacksonjackson-databind

解决方案


Ok, yes, this works as long as it's combined with @EnableWebMvc rather than <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;
            }
        }
    }
}

推荐阅读