我有以下返回文件的 spring mvc 方法:
@RequestMapping(value = "/files/{fileName}", method = RequestMethod.GET)
public FileSystemResource getFiles(@PathVariable String fileName){
String path="/home/marios/Desktop/";
return new FileSystemResource(path+fileName);
}
Run Code Online (Sandbox Code Playgroud)
我希望 ResourceHttpMessageConverter 根据其文档使用八位字节流类型创建适当的响应:
如果 JAF 不可用,则使用 application/octet-stream。
但是,尽管我正确地获取文件没有问题,但结果具有Content-Type: application/json;charset=UTF-8
你能告诉我为什么会这样吗?
(我使用 spring 版本 4.1.4。我没有明确设置任何消息转换器,我知道 spring 默认加载 ResourceHttpMessageConverter 和 MappingJackson2HttpMessageConverter,因为我的类路径中有 jackson 2,因为我有其他 mvc返回 json 的方法。
此外,如果我HttpEntity<FileSystemResource>手动使用和设置内容类型,或者用produces = MediaType.APPLICATION_OCTET_STREAM它指定它工作正常。
另请注意,在我的请求中,我没有指定任何接受内容类型,并且不希望依赖我的客户来做到这一点)
我最终调试了整个事情,我发现AbstractJackson2HttpMessageConverter有一个canWrite实现在情况下返回 true FileSystemResource,因为它只是检查类是否可序列化,并且设置的媒体类型为 null,因为我没有指定任何在这种情况下是应该是得到它的支持。
结果,它最终将 json 内容类型放入可生成的媒体类型列表中。当然ResourceHttpMessageConverter.canWrite,实现也自然会返回 true,但ResourceHttpMessageConverter不会返回任何可生成的媒体类型。
当写入实际响应的时间到来时,从write方法实现开始,首先运行写入ResourceHttpMessageConverter,因为它ResourceHttpMessageConverter是可用转换器列表中的第一个(如果MappingJackson2HttpMessageConverter是第一个,它将尝试调用,write因为它canWrite返回 true并抛出异常),并且由于已经存在可生成的内容类型集,因此它不会默认运行ResourceHttpMessageConverter.getDefaultContentType将设置正确的内容类型。
如果我删除 json 转换器,一切都会正常工作,但不幸的是我的 json 方法都不起作用。因此指定内容类型是摆脱返回的 json 内容类型的唯一方法
| 归档时间: |
|
| 查看次数: |
2294 次 |
| 最近记录: |