gpt4 book ai didi

spring - FileSystemResource 以内容类型 json 返回

转载 作者:行者123 更新时间:2023-12-02 07:00:51 29 4
gpt4 key购买 nike

我有以下返回文件的 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 根据其文档创建具有八位字节流类型的适当响应:

If JAF is not available, application/octet-stream is used.

尽管我正确地获取了文件,没有任何问题,但结果是 Content-Type: application/json;charset=UTF-8

你能告诉我为什么会发生这种情况吗?

(我使用 spring 版本 4.1.4。我没有显式设置任何消息转换器,并且我知道 spring 默认加载 ResourceHttpMessageConverter 和 MappingJackson2HttpMessageConverter,因为我的类路径中有 jackson 2,因为我还有其他返回 json 的 mvc 方法。

如果我使用 HttpEntity<FileSystemResource>并手动设置内容类型,或使用 produces = MediaType.APPLICATION_OCTET_STREAM 指定它效果很好。

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

最佳答案

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

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

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

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

关于spring - FileSystemResource 以内容类型 json 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28193999/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com