推荐继承 AbstractHttpMessageConverter<IotFrame> 实现流式协议解析:构造时指定 MediaType,重写 supports/writeInternal/readInternal 处理魔数头、分块载荷与校验码,通过 WebMvcConfigurer 的 extendMessageConverters 注册并置顶,配合 @RequestBody/@ResponseBody 与对应 Content-Type/Accept 触发。

直接继承 AbstractHttpMessageConverter,按协议读写原始流,再注册到 MVC 配置中——这是处理特殊报文格式最稳妥的方式。
明确你的协议边界
非标准格式(比如带 magic number 的二进制头、分块 payload、尾部校验码)无法交给 Jackson 或 StringConverter 处理。先确认几个关键点:
- 请求体是否含固定头部(如 4 字节标识 + 4 字节总长度)
- 数据是否分段传输(类似 chunked,但无 CRLF,靠长度字段驱动)
- 是否需服务端校验(例如读完全部字节后验证 CRC32)
- 用哪个 MediaType 标识它:复用
application/octet-stream,还是注册新类型如application/x-iot-frame
写一个流式 Converter
推荐继承 AbstractHttpMessageConverter<YourDataClass>,而不是从零实现接口,省去泛型匹配和类型判断逻辑。
- 构造时传入你支持的 MediaType,比如
new MediaType("application", "x-iot-frame") - 重写
supports(Class<?>),只对目标业务类(如IotFrame.class)返回 true -
writeInternal()中获取HttpOutputMessage.getBody()输出流,依次写入 header → payload → checksum -
readInternal()中从HttpInputMessage.getBody()输入流按协议解析:先读 header 得长度 → 循环读 chunk → 校验 → 组装对象 - 务必在构造器里调用
setSupportedMediaTypes(...),否则 Spring 不识别该 MediaType
注册进 Spring MVC 流程
必须让这个 Converter 被 Spring MVC 的消息转换链看到,推荐 Java Config 方式:
立即学习“Java免费学习笔记(深入)”;
- 创建一个
@Configuration类,实现WebMvcConfigurer - 重写
extendMessageConverters(List<HttpMessageConverter<?>> converters) - 调用
converters.add(0, new YourCustomConverter())—— 加在最前面,确保优先匹配 - 不要用
configureMessageConverters全量替换,默认 Converter 会丢失(比如 JSON 支持就没了)
触发它生效的写法
Converter 不会自动启用,得靠注解或类型触发:
- 接收请求时,在 Controller 方法参数上加
@RequestBody IotFrame frame - 返回响应时,在方法上加
@ResponseBody,或返回类型是IotFrame并标注@GetMapping(produces = "application/x-iot-frame") - 前端请求必须带
Content-Type: application/x-iot-frame,响应要声明Accept: application/x-iot-frame


















