如何在 Spring MVC(不是 Spring Boot)应用程序中自定义 Jackson
How to customize Jackson in Spring MVC (not Spring Boot) application
Spring MVC 4.3.29 和 Java 8(当前平台限制),主要是 XML 配置,除了一些控制器 类 是注解扫描的.
简而言之,我想获取 Spring JSON 反序列化自动使用的 ObjectMapper
实例,我想将其 FAIL_ON_UNKNOWN_PROPERTIES
设置回 true
.
我看到了several questions, but all the examples seem to be Spring Bootand/orJava配置。 none 建议的 @Autowired
bean(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 覆盖,但我仍然有“主人” <mvc:annotation-driven/>
。我想知道这些是否相互混淆...
这个 kind-of“有效”,但是通过完全替换 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
注入这些对象并弄乱它们,但在这种情况下我不需要这样做,因为只是一个新的默认 Jackson 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;
}
}
}
}
Spring MVC 4.3.29 和 Java 8(当前平台限制),主要是 XML 配置,除了一些控制器 类 是注解扫描的.
简而言之,我想获取 Spring JSON 反序列化自动使用的 ObjectMapper
实例,我想将其 FAIL_ON_UNKNOWN_PROPERTIES
设置回 true
.
我看到了several @Autowired
bean(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 覆盖,但我仍然有“主人” <mvc:annotation-driven/>
。我想知道这些是否相互混淆...
这个 kind-of“有效”,但是通过完全替换 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
注入这些对象并弄乱它们,但在这种情况下我不需要这样做,因为只是一个新的默认 Jackson 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;
}
}
}
}