Spring MVC 中,自动加载 JSON 转换器
来源:互联网 发布:华为网络交换机的作用 编辑:程序博客网 时间:2024/06/03 10:43
在 RESTful接口 盛行的现在, 让接口返回 JSON 格式的字符串,已经成为了大家几乎共同的选择。
之前的项目,通过 Spring 来实现了 RESTful,接口返回的就是 JSON的。而且,我一直以为,只要在spring的xml配置文件中开启了<mvc:annotation-driven />
之后,系统就会自动加载 MappingJackson2HttpMessageConverter 这个用于将 HashMap
、List
、POJO
对象转换为 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()); } }}
相信大家看到这里的时候,就明白了吧。 : )
0 0
- Spring MVC 中,自动加载 JSON 转换器
- spring mvc 自动封装json
- Spring MVC处理JSON数据(3)-自定义消息转换器
- Spring MVC 转换器
- Spring MVC配置response自动转json
- Spring MVC自动返回XML/JSON
- Spring MVC @JsonView实现在消息转换器中过滤数据
- Spring MVC 创建自定义转换器
- Spring mvc 自定义时间转换器
- Spring mvc 自定义时间转换器
- spring MVC自定义日期转换器
- Spring mvc日期Date转换器
- spring MVC 转换器的使用
- Spring MVC自定义类型转换器
- Spring Boot JSON消息转换器
- spring mvc配置json转换器,jar包冲突导致配置无效
- spring mvc返回json格式到客户端,并且在Controller中自动将对象转换为json
- MVC中类的自动加载
- SQL Join的一些总结(实例)
- [Azure]使用Powershell清理ARM中的无效资源
- Java集合框架——Map
- PYTHON的TIME模块
- 第55篇铅笔三个按钮自动出来处理(一)
- Spring MVC 中,自动加载 JSON 转换器
- 常用的英语学习网站(持续更新中)
- Android第十课;线性布局
- 面试笔试真题(1)
- swift 之UIWebView
- 微软云计算随笔1-批量为虚拟机添加IP地址描述
- 《Java多线程编程核心技术》---Thread用run( )启动和用start( )区别
- 计算广告系列篇(6)------推荐
- 单链表源码二