如何在Spring MVC(不是Spring Boot)应用程序中自定义Jackson

问题描述 投票:0回答:2

Spring MVC 4.3.29 和 Java 8(当前平台限制),大部分是 XML 配置,除了一些注释扫描的 Controller 类。

简而言之,我想获得 Spring JSON 反序列化自动使用的

ObjectMapper
实例,并且我想将其
FAIL_ON_UNKNOWN_PROPERTIES
设置回
true

我看到几个相关问题,但所有示例似乎都是Spring Boot和/或Java配置。并且建议的

@Autowired
beans(Mapper、Builder 等)在我的 WebSphere 环境中根本没有任何值。

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

编辑:呸,我以为我已经做到了:

@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 spring-mvc jackson jackson-databind
2个回答
1
投票

好的,是的,只要与

@EnableWebMvc
而不是
<mvc:annotation-driven/>
结合使用即可:

@EnableWebMvc
@Configuration
public class CustomWebConfiguration implements WebMvcConfigurer {

    @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;
            }
        }
    }
}

0
投票

这种“有效”,但是通过完全替换Spring的

ObjectMapper
,它会丢失它所具有的任何其他自定义功能,我真的不想这样做。

来自这个答案

<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
实际上就可以恢复我想要的行为。

© www.soinside.com 2019 - 2024. All rights reserved.