Spring 4.2.4.RELEASE MVC 学习笔记 - 9 - MedaiType
本章是继续上一章节未完成任务的继续学习,之所以单独列出,只是因为避免章节内容过长不好阅读,其次是后续内容以自己编码实现的过程,没有可以直接整合的东西。
学习目标
URL后缀 | 请求Mediatype映射 | 学习目标 |
---|---|---|
application/pdf; charset=UTF-8 | Controller处理方法返回对象解析成pdf文件 | |
*.xls | application/xls; charset=UTF-8 | Controller处理方法返回对象解析成xls文件 |
*.xlsx | application/xlsx; charset=UTF-8 | Controller处理方法返回对象解析成xlsx文件 |
测试地址 | 结果 |
---|---|
http://127.0.0.1:8000/restfull/book.pdf | 将Result数据对象处理成pdf文件字节流返回 |
http://127.0.0.1:8000/restfull/book.xls | 将Result数据对象处理成xls文件字节流返回 |
http://127.0.0.1:8000/restfull/book.xlsx | 将Result数据对象处理成xlsx文件字节流返回 |
/restfull/book.pdf请求的实现
直接运行项目,在浏览器中访问/restfull/book.pdf地址,结果如下图。显而易见,直接返回406错误,没有返回正确的结果。
再看看请求头和响应头信息,请求头浏览器默认指定了Accept信息但是我们没有看到application/pdf,在看看响应头Content-Type信息为text/html,也不是我们想要的application/pdf结果。
在第8章中,我们知晓了,浏览器中直接访问/restfull/book.pdf时,Spring MVC会通过URI的后缀”.pdf”解析出该请求MedaiType=application/pdf,然后优先遍历所有的实现了HttpMessageConverter接口的数据解析器,查看是否存在对应的数据解析器。然后我们日志中可以看出Spring MVC并没有找到MedaiType=application/pdf的数据解析器。
既然知道原因,剩下就好办了。
方法1:可以在看看Spring其他提供支持jar中是否有可以处理该MedaiType=application/pdf的数据解析器,如果有直接引入(和之前分析json和xml类似);
方法2:百度去找有没有第三方的工具jar,其中有提供实现了spring mvc的HttpMessageConverter接口类,引入该jar,将该类注册到Spring中;
方法3:参考自定义数据解析器GSONHttpMessageConverte,自己为MedaiType=application/pdf编写自定义解析器;
方法1:使用Spring MVC框架提供支持
方法1,在这里单独列出来,主要是目的就是带着大家走一下想法,如果Spring框架中本身有的功能能满足我们需求,那就直接使用就好了,只有当没有或者无法满足的时候,我们自己创造轮子吧。
查看现有引入的Spring框架jar包中,所有的实现了HttpMessageConverter接口的派生类,查看源码是否有处理解析MedaiType=application/pdf的数据解析器。(之前我们都找过了,这里我还是在列出来一次吧。)
我也是闲着没事,就顺便把所有的Converter可实例化的子类都看了一遍,发现确实没有!不过有比较像的,下面我直接列出来。
org.springframework.http.converter.ResourceHttpMessageConverter
package org.springframework.http.converter;
...省略...
public class ResourceHttpMessageConverter extends AbstractHttpMessageConverter<Resource> {
...省略...
public ResourceHttpMessageConverter() {
super(MediaType.ALL);
//构造方法,直接支持了所有的MediaType类型,其中肯定支持MedaiType=application/pdf的。所以看到这个的时候
}
@Override
protected boolean supports(Class<?> clazz) {
return Resource.class.isAssignableFrom(clazz);
//但是看到这个方法,我又灰心了,该方法是重写了父类方法,名字上分析是是否支持。重写代码逻辑上看应该对解析数据对象有类型要求。所以该类也不好使。
}
...省略...
}
工程内的所有实现了HttpMessageConverter接口的派生类我都看了,木有找到支持的,没办法只能去网上继续找了,看看spring框架下那些我没有引入的jar中是否存在(http://mvnrepository.com/ 上面查找)。
结果,很不幸,我也没有找到。哈哈。。。。。就到这里吧。
方法2:使用第三方jar提供的数据解析器
呵呵,请同学们直接看方法3吧,方法2没有什么太大意思。方法3掌握了方法2就不算什么了。
方法3:自定义数据解析器
待续。。。。最近事情比较多。。。