手机版
你好,游客 登录 注册
背景:
阅读新闻

Spring MVC 中自动加载 JSON 转换器

[日期:2017-01-22] 来源:Linux社区  作者:rainbow702 [字体: ]

RESTful接口 盛行的现在, 让接口返回 JSON 格式的字符串,已经成为了大家几乎共同的选择。
之前的项目,通过 spring 来实现了 RESTful,接口返回的就是 JSON的。而且,我一直以为,只要在spring的xml配置文件中开启了<mvc:annotation-driven /> 之后,系统就会自动加载 MappingJackson2HttpMessageConverter 这个用于将 HashMapListPOJO 对象转换为 JSON 的 message converter的。
但是,今天自己在新建一个项目之后,按照上面的配置,却怎么也不行。后来看了一下源码,才发现问题所有:

必须将 jackson 对应的jar包引入,spring 才会自动加载上面这个 message converter

为什么会这样?可以先移步至我的另一篇博客大概看一下:mvc:annotation-driven 的变更

从上面这篇blog中,可以看出里面已经有了介绍了。但我还是忘了这一点,导致走了弯路。今天决定看一下源码,增加一下印象,避免以后再走弯路。

具体可以参考以下源码 (RequestMappingHandlerAdapter):

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
        implements BeanFactoryAware, InitializingBean {

    ...

    public RequestMappingHandlerAdapter() {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
        stringHttpMessageConverter.setWriteAcceptCharset(false);  // see SPR-7316

        this.messageConverters = new ArrayList<HttpMessageConverter<?>>(4);
        this.messageConverters.add(new ByteArrayHttpMessageConverter());
        this.messageConverters.add(stringHttpMessageConverter);
        this.messageConverters.add(new SourceHttpMessageConverter<Source>());
        this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    }

    ...
}

最重要的是最后这一句:this.messageConverters.add(new AllEncompassingFormHttpMessageConverter())
其中,AllEncompassingFormHttpMessageConverter 的实现为:

public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter {

    private static final boolean jaxb2Present =
            ClassUtils.isPresent("javax.xml.bind.Binder", AllEncompassingFormHttpMessageConverter.class.getClassLoader());

    private static final boolean jackson2Present =
            ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader()) &&
                    ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", AllEncompassingFormHttpMessageConverter.class.getClassLoader());

    private static final boolean jackson2XmlPresent =
            ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader());

    private static final boolean gsonPresent =
            ClassUtils.isPresent("com.google.gson.Gson", AllEncompassingFormHttpMessageConverter.class.getClassLoader());


    public AllEncompassingFormHttpMessageConverter() {
        addPartConverter(new SourceHttpMessageConverter<Source>());

        if (jaxb2Present && !jackson2XmlPresent) {
            addPartConverter(new Jaxb2RootElementHttpMessageConverter());
        }

        if (jackson2Present) {
            addPartConverter(new MappingJackson2HttpMessageConverter());
        }
        else if (gsonPresent) {
            addPartConverter(new GsonHttpMessageConverter());
        }

        if (jackson2XmlPresent) {
            addPartConverter(new MappingJackson2XmlHttpMessageConverter());
        }
    }
}

相信大家看到这里的时候,就明白了吧。 : )

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-01/139814.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款