You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:34:50