Spring生成PDF接口正常但报ByteArrayInputStream序列化异常求助
问题分析与解决方案
异常原因
你遇到的问题本质是:Spring在处理ResponseEntity<Resource>时,有额外组件(比如Swagger/OpenAPI文档生成工具、全局Jackson配置)尝试将整个ResponseEntity对象序列化为JSON,而ByteArrayResource内部的inputStream属性是ByteArrayInputStream实例——这个类没有Jackson默认提供的序列化器,也没有可被序列化的公共属性,因此抛出序列化失败异常。
至于Postman能正常下载PDF,是因为实际请求时,Spring会根据你设置的MediaType.APPLICATION_OCTET_STREAM和ByteArrayResource类型,选择ResourceHttpMessageConverter直接输出二进制流,客户端能正常接收,但后台的序列化检查仍会触发,导致异常日志输出。
解决办法
方法1:替换ByteArrayResource为更合适的类型
直接返回byte[]或使用InputStreamResource,避免Jackson触发对ByteArrayResource的序列化:
// 方式一:直接返回byte[] return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"item-report." + format+"\"") .body(reportContent); // 方式二:使用InputStreamResource return ResponseEntity.ok() .contentType(MediaType.APPLICATION_OCTET_STREAM) .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"item-report." + format+"\"") .body(new InputStreamResource(new ByteArrayInputStream(reportContent)));
方法2:配置Jackson禁用空Bean序列化失败检查
添加Jackson全局配置,让它忽略无序列化器的空Bean:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 禁用空Bean序列化失败的特性 mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); return mapper; } }
方法3:排查并关闭不必要的序列化触发源
如果是Swagger/OpenAPI导致的异常,可检查是否有全局请求拦截器在尝试序列化所有响应对象,或调整Swagger配置,让它忽略该接口的响应序列化检查。
内容的提问来源于stack exchange,提问作者rekotc
相关产品推荐
相关产品推荐

