首页 > 解决方案 > HTTP 状态 406 – 不可接受 [使用 spring 4.3.x + Java 8 从后端流式传输大量数据]

问题描述

我正在使用 Spring mvc 4.3.x、java 8、Tomcat 7

代码:

@Controller
public class StreamRecordsController {

    @RequestMapping(value = "/streamrecords", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE, 
            produces = "application/octet-stream")
    @ResponseBody
    public ResponseEntity<StreamingResponseBody> export() throws FileNotFoundException {
        File file = new File("C:\\Users\\Ankur\\sample.pdf");
        StreamingResponseBody responseBody = outputStream -> {
            Files.copy(file.toPath(), outputStream);
        };
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=generic_file_name.pdf")
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(responseBody);
    }
}

例外:

在此处输入图像描述

邮递员快照

在此处输入图像描述 问题:

我在这里想念什么?

标签: javaspringspring-mvcjava-8

解决方案


发生在您身上的可能是 Spring MVC 错误。对于浏览器,它也因浏览器而异 - 请求中的接受标头是强制性的,具有正确的值。您可能会在不同的浏览器中获得不同的行为,并且您的代码可能会在 swagger UI 中运行。

根据您的屏幕截图,您的 Accept 标头与响应类型不匹配,这应该是*/*因为您的代码是特殊的,因为您不接受任何输入,这在 REST 世界中是一种罕见的情况。

所以我建议在你的映射中添加消耗,如下所示,看看它是否有效,

@RequestMapping(value = "/streamrecords", method = RequestMethod.GET, consumes = MediaType.ALL_VALUE)

并确保请求中的 Accept 标头带有值 - */*


推荐阅读