Spring控制器导出带图表Excel时遇415不支持媒体类型错误
Spring控制器导出带图表Excel时415媒体类型不兼容问题
我开发了一个可生成带图表Excel文件的Spring控制器,但修改映射的produces属性后,始终遇到415错误:"不支持媒体类型(octet-stream)"。
请求头信息(Postman截图内容)
请求头配置:
Content-Type: application/jsonAccept: application/octet-stream
控制器代码
@PostMapping(value = "/exportfile/excel", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE}) public ResponseEntity<InputStreamResource> exportExcel(@RequestBody ClientDataObjectRequest clientDataObjectRequest) { ByteArrayInputStream file = generateCSVExcelService.generateFileDetailsWithChart(clientDataObjectRequest); String dateFile = new SimpleDateFormat("MM-dd-yyyy").format(new java.util.Date()); String timeFile = new SimpleDateFormat("HH-mm").format(new java.util.Date()); String fileName = clientDataObjectRequest.getMetricName().replace(" ","_") + "_" + dateFile + "T" + timeFile; HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", fileName + ".xlsx"); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName + ".xlsx"); //headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); return new ResponseEntity<>(new InputStreamResource(file), headers, HttpStatus.OK); }
我已经在produces中设置了APPLICATION_OCTET_STREAM_VALUE,请求和响应头也做了对应配置,但还是报错,请问我遗漏了什么?
请求体(JSON格式)
{ "metricName":"Turnover Rate", "dataFormatCodeValue": "currency", "clientDataRequest":[ { "clientName":"client 1", "value":"1" }, { "clientName":"client 2", "value":"2" }, { "clientName":"client 3", "value":"53.78" }, { "clientName":"client 4", "value":"3" }, { "clientName":"client 5555555", "value":"4" }, { "clientName":"client 6", "value":"33" }, { "clientName":"client 7", "value":"0" }, { "clientName":"client 8", "value":"8.5" } ] }
问题解决思路
415错误的核心是服务器无法处理请求发送的媒体类型,你的问题出在这几个地方:
补全请求媒体类型声明
produces是定义响应的媒体类型,而你用@RequestBody接收JSON请求体,却没在@PostMapping里声明支持的请求类型,加上consumes配置即可:@PostMapping(value = "/exportfile/excel", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE}, consumes = MediaType.APPLICATION_JSON_VALUE)检查JSON解析依赖
确保项目里有Jackson相关依赖(Spring Boot的spring-boot-starter-web默认包含),纯Spring项目需手动引入jackson-databind,否则无法解析JSON请求体。确认请求头的
Content-Type
检查Postman里的Content-Type是否确实是application/json,不要误设成application/octet-stream——后者是你期望的响应类型,不是请求类型。
内容的提问来源于stack exchange,提问作者dcm50
相关产品推荐
相关产品推荐

