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

Java REST API返回含BLOB属性对象时序列化报错求助

问题解决方案

核心原因:你的Upload实体中包含java.io.ByteArrayInputStream类型的字段,Jackson默认没有该类型的序列化器,当Spring MVC尝试将实体序列化为响应体时,就会抛出InvalidDefinitionException错误。调试阶段未触发序列化流程,所以不会报错。

以下是三种可行的解决方式:

1. 替换字段类型(推荐)

把ByteArrayInputStream替换为byte[],Jackson原生支持byte数组的序列化,更适合二进制数据的传输与存储:

  • 修改Upload实体的字段定义:
    // 原字段
    // private ByteArrayInputStream fileContent;
    // 修改后
    private byte[] fileContent;
    
  • 业务逻辑中把输入流转为byte数组,可借助Apache Commons IO的IOUtils工具类:
    byte[] fileBytes = IOUtils.toByteArray(yourInputStream);
    

2. 忽略该字段的序列化

如果这个二进制字段不需要返回给前端,直接用Jackson注解标记忽略:

@JsonIgnore
private ByteArrayInputStream fileContent;

3. 自定义Jackson序列化器

若必须保留ByteArrayInputStream类型,可编写自定义序列化器处理:

  • 实现序列化器类:
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.ser.std.StdSerializer;
    import org.apache.commons.io.IOUtils;
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    
    public class ByteArrayInputStreamSerializer extends StdSerializer<ByteArrayInputStream> {
        public ByteArrayInputStreamSerializer() {
            super(ByteArrayInputStream.class);
        }
    
        @Override
        public void serialize(ByteArrayInputStream value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            // 将输入流转为byte数组后序列化
            byte[] content = IOUtils.toByteArray(value);
            gen.writeBinary(content);
        }
    }
    
  • 在实体字段上指定使用该序列化器:
    @JsonSerialize(using = ByteArrayInputStreamSerializer.class)
    private ByteArrayInputStream fileContent;
    

内容的提问来源于stack exchange,提问作者Pat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:31:17