您的位置:首页 > 编程语言 > Java开发

Spring 4.2.4.RELEASE MVC 学习笔记 - 9 - MedaiType(咋个办呢 zgbn)

2016-03-15 14:37 549 查看

Spring 4.2.4.RELEASE MVC 学习笔记 - 9 - MedaiType

本章是继续上一章节未完成任务的继续学习,之所以单独列出,只是因为避免章节内容过长不好阅读,其次是后续内容以自己编码实现的过程,没有可以直接整合的东西。

学习目标

URL后缀请求Mediatype映射学习目标
*.pdfapplication/pdf; charset=UTF-8Controller处理方法返回对象解析成pdf文件
*.xlsapplication/xls; charset=UTF-8Controller处理方法返回对象解析成xls文件
*.xlsxapplication/xlsx; charset=UTF-8Controller处理方法返回对象解析成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:自定义数据解析器

待续。。。。最近事情比较多。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: