OpenAPI生成客户端:让Jackson ObjectMapper透传字节数组的方法
解决ObjectMapper透传原始字节数组的问题
你的核心问题是ObjectMapper默认会将输入的字节数组当作JSON内容解析,但图片的原始字节并非合法JSON格式,导致解析报错。要在必须使用ObjectMapper的约束下实现字节数组透传,可以通过自定义字节数组反序列化器绕过JSON解析逻辑,直接返回原始字节。
实现步骤
- 编写自定义反序列化器
创建一个继承自JsonDeserializer<byte[]>的类,直接从输入流读取所有原始字节,不做任何JSON解析:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; public class RawByteArrayDeserializer extends JsonDeserializer<byte[]> { @Override public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 直接读取输入流的全部原始字节 return p.getBinaryValue(); } }
- 配置ObjectMapper
将自定义反序列化器注册到ObjectMapper中,覆盖默认的byte[]解析逻辑:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import java.util.Arrays; public class TestByteTransmission { public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); // 注册自定义反序列化器到byte[]类型 module.addDeserializer(byte[].class, new RawByteArrayDeserializer()); objectMapper.registerModule(module); // 测试验证 byte[] originalByteArray = HexFormat.of().parseHex("e04fd020ea3a6910a2d808002b30309d"); byte[] byteArray = objectMapper.readValue(originalByteArray, byte[].class); // 输出对比结果,应为true System.out.println(Arrays.equals(originalByteArray, byteArray)); } }
原理说明
默认情况下,Jackson的byte[]反序列化器会尝试将输入解析为Base64编码的JSON字符串(符合JSON规范的二进制数据表示方式),但你的输入是图片原始字节,并非Base64,因此触发UTF-8解析错误。自定义反序列化器通过p.getBinaryValue()直接读取输入流的原始字节,完全跳过JSON解析流程,从而实现字节数组的原样透传。
适配OpenAPI生成的客户端
将上述配置好的ObjectMapper传入OpenAPI客户端的配置中即可(具体方式取决于客户端生成工具,通常可通过客户端的ApiClient类的setObjectMapper方法设置)。
内容的提问来源于stack exchange,提问作者Antônio
相关产品推荐
相关产品推荐

