FileSystemResource 以内容类型 json 返回

Mar*_*ios 5 spring spring-mvc

我有以下返回文件的 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它指定它工作正常。

另请注意,在我的请求中,我没有指定任何接受内容类型,并且不希望依赖我的客户来做到这一点)

Mar*_*ios 5

我最终调试了整个事情,我发现AbstractJackson2HttpMessageConverter有一个canWrite实现在情况下返回 true FileSystemResource,因为它只是检查类是否可序列化,并且设置的媒体类型为 null,因为我没有指定任何在这种情况下是应该是得到它的支持。

结果,它最终将 json 内容类型放入可生成的媒体类型列表中。当然ResourceHttpMessageConverter.canWrite,实现也自然会返回 true,但ResourceHttpMessageConverter不会返回任何可生成的媒体类型。

当写入实际响应的时间到来时,从write方法实现开始,首先运行写入ResourceHttpMessageConverter,因为它ResourceHttpMessageConverter是可用转换器列表中的第一个(如果MappingJackson2HttpMessageConverter是第一个,它将尝试调用,write因为它canWrite返回 true并抛出异常),并且由于已经存在可生成的内容类型集,因此它不会默认运行ResourceHttpMessageConverter.getDefaultContentType将设置正确的内容类型。

如果我删除 json 转换器,一切都会正常工作,但不幸的是我的 json 方法都不起作用。因此指定内容类型是摆脱返回的 json 内容类型的唯一方法