返回内容类型为json的FileSystemResource

时间:2015-01-28 13:54:17

标签: 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);

}

我希望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指定它,则可以正常工作。

另请注意,在我的请求中,我没有指定任何接受内容类型,并且不希望依赖我的客户来执行此操作)

1 个答案:

答案 0 :(得分:3)

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

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

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

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