我有以下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);
}
我希望ResourceHttpMessageConverter根据其文档创建一个八位字节流类型的相应响应:
如果JAF不可用,则使用application / octet-stream。
然而,虽然我没有问题正确地获取文件,但结果是 Content-Type:application / json; charset = UTF-8
你能告诉我为什么会这样吗?
(我使用Spring版本4.1.4。我没有明确设置任何消息转换器,我知道spring默认加载ResourceHttpMessageConverter以及MappingJackson2HttpMessageConverter,因为我的classpath中有jackson 2,因为我有其他返回json的mvc方法。
此外,如果我使用HttpEntity<FileSystemResource>
并手动设置内容类型,或者使用produces = MediaType.APPLICATION_OCTET_STREAM
指定它,则可以正常工作。
另请注意,在我的请求中,我没有指定任何接受内容类型,并且不希望依赖我的客户来执行此操作)
答案 0 :(得分:3)
我最终调试了整个事情,我发现AbstractJackson2HttpMessageConverter
有一个canWrite
实现,在FileSystemResource
的情况下返回true,因为它只检查类是否可序列化,并且设置的媒体类型为null,因为我没有指定在这种情况下应该支持的任何媒体类型。
因此,它最终将json内容类型放在可生成的媒体类型列表中。当然ResourceHttpMessageConverter.canWrite
实现自然也会返回true,但ResourceHttpMessageConverter
不返回任何可生成的媒体类型。
当编写实际响应的时间来自write
方法实现时,ResourceHttpMessageConverter
的写入首先运行,因为ResourceHttpMessageConverter
是列表中的第一个可用的转换器(如果MappingJackson2HttpMessageConverter
是第一个,它将尝试调用write
,因为它的canWrite
返回true并抛出异常),并且因为已经有可生成的内容类型集,所以不会默认运行会设置正确内容类型的ResourceHttpMessageConverter.getDefaultContentType
。
如果我删除json转换器一切都会正常工作,但不幸的是我的json方法都没有用。因此,指定内容类型是摆脱返回的json内容类型的唯一方法