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

20 篇文章 0 订阅
3 篇文章 0 订阅

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:自定义数据解析器

待续。。。。最近事情比较多。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值