场景一:在Spring Boot开发中,使用@RestController注解的Controller类默认会将返回值通过MappingJackson2HttpMessageConverter序列化为JSON格式。但在文件下载等场景中,需返回二进制流(如application/octet-stream),此时若直接返回POJO对象,会触发异常:
No converter for [...] with preset Content-Type 'application/octet-stream'

问题本质:
@RestController的默认行为与文件下载的响应格式冲突。当方法返回值非void且未显式指定响应内容类型时,Spring会尝试将对象序列化为JSON,但缺少对应Content-Type的转换器。

场景二:在SpringBoot中可能还会遇到引入和SpringCloud Gateway功能,但是Gateway会和Spring-Web产生冲突往往会不引入Spring-Web模块,这时出现文件的下载功能时就无法使用httpservletresponse进行数据流上传,会触发异常:No primary or single unique constructor found

问题本质:Gateway为实现httpservletresponse接口导致无法找到构造器

解决方案:

1.使用多个接口,当有文件下载时将文件信息给前端,后端开放根据文件信息下载文件的接口,此方法简单则不进行赘述

2.使用RespinseEntity<?>构建返回值

@GetMapping("/download")
public ResponseEntity<?> downloadFile(String type) {
    // 根据type参数判断是否下载文件
    if ("file".equals(type)) {
        try {
            File file = new File("path/to/yourfile.txt");
            if (!file.exists()) {
                throw new FileNotFoundException("文件不存在");
            }

            // 构建文件Resource
            Resource resource = new FileSystemResource(file);

            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .body(resource);

        } catch (FileNotFoundException e) {
            // 文件不存在时返回JSON错误信息
            return ResponseEntity.status(404)
                    .contentType(MediaType.APPLICATION_JSON)
                    .body(new AjaxResult(Type.ERROR, e.getMessage()));
        }
    } else {
        // 默认返回JSON数据
        return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body(new AjaxResult(Type.SUCCESS, "请求成功,数据如下..."));
    }
}

如果在使用RespinseEntity时出现如下问题,可能是没有配置全局序列化配置,可在配置中添加如下序列化转换配置

no converter for with preset content-type application/octet-stream

converters.add(new ResourceHttpMessageConverter());
converters.add(new ByteArrayHttpMessageConverter());

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐