Jackson配置<mvc:annotation-driven>替代方案
看Jackson视频学习的时候发现讲师用的是XML配置,我自己是继承WebMvcConfigurerAdapter的纯Java代码的方式配置。
然后......找了半天才搞明白怎么转换,讲师的写法如下:
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <bean name="MappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
第一个bean设置全局编码格式为UTF-8,第二个bean参数是设置如果是空对象的时候不抛异常而返回空的Object
就第二个配置的时候难倒我了,bean里面有属性property正常,property里面再套一个bean是俄罗斯套娃?
其实是实例化Jackson2ObjectMapperFactoryBean,设置其参数,再传入到MappingJackson2HttpMessageConverter里面的objectMapper里面。
可是这个Jackson2ObjectMapperFactoryBean怎么传入到objectMapper里?ObjectMapper的构造方法不能传这个类型的对象,也不能通过set方法设置。
扒源码看看,发现Jackson2ObjectMapperFactoryBean的set方法如下:
private final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
public void setFailOnEmptyBeans(boolean failOnEmptyBeans) { this.builder.failOnEmptyBeans(failOnEmptyBeans); }
Jackson2ObjectMapperFactoryBean使用内置的builder设置其属性:
public Jackson2ObjectMapperBuilder failOnEmptyBeans(boolean failOnEmptyBeans) { this.features.put(SerializationFeature.FAIL_ON_EMPTY_BEANS, failOnEmptyBeans); return this; }
Jackson2ObjectMapperBulider使用的是枚举类SerializationFeature里的FAIL_ON_EMPTY_BEANS属性,默认是true的。
因此继承WebMvcConfigurerAdapter的配置类只需要这样写,就可以实现同等配置:
@Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(mapper); converters.add(converter); }
参考:
ObjectMapper详细介绍,真的就这么简单:https://blog.csdn.net/qq_42017395/article/details/107555339
springboot2.0配置WebMvcConfigurer的configureMessageConverters方法不启用:https://blog.csdn.net/qq_38951372/article/details/96423781

浙公网安备 33010602011771号