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

 

posted @ 2021-01-28 18:36  royapk  阅读(438)  评论(0)    收藏  举报